這個問題沒有功能價值。只是想更好地理解scala。所有集合固有的Iterable。Iterable中沒有isMutable方法。isMutable就以下是否是評估可變性最有效的方法征求意見。這似乎很古老,但除了測驗所有可變集合類之外找不到替代方法,這并不理想,因為將來可能會添加新的可變類。(我會定義使用的方法,implicit但不是為了簡單起見)。
import scala.collection.{immutable, mutable}
object IsMutable extends App {
val mutableMap: mutable.Map[String, Int] = mutable.Map("Apples" -> 4,"Pineapples" -> 1,"Oranges" -> 10,"Grapes" -> 7)
val immutableMap: immutable.Map[String, Int] = Map("Apples" -> 4,"Pineapples" -> 1,"Oranges" -> 10,"Grapes" -> 7)
def isMutable[A](obj: Iterable[A]): Boolean = obj.getClass.toString.startsWith("class scala.collection.mutable")
println(isMutable(mutableMap))
println(isMutable(immutableMap))
}
uj5u.com熱心網友回復:
我認為依賴類名不是一個好方法,盡管我相信我提出的方法可能不是找出集合是否可變的最優雅/最好的方法。但是你可以使用這個:
import scala.reflect.ClassTag
def isMutable[T](iterable: scala.collection.Iterable[T]): Boolean =
iterable.isInstanceOf[scala.collection.mutable.Iterable[T]]
我認為它適用于大多數型別(下面奇怪的界面是因為我使用 ammonite 作為 REPL,這非常酷:D)。
@ val immutableMap = scala.collection.immutable.Map[String, String]()
immutableMap: Map[String, String] = Map()
@ isMutable(immutableMap)
res14: Boolean = false
@ val mutableMap = scala.collection.mutable.Map[String, String]()
mutableMap: mutable.Map[String, String] = HashMap()
@ isMutable(mutableMap)
res16: Boolean = true
uj5u.com熱心網友回復:
如果可以的話,AminMal 的想法。可變集合確實可以擴展mutable.Iterable,因此檢查您的集合是否是它的實體是不言自明的。
作為一種替代方式:可變集合繼承了 2 個允許它們在內部發生變異的特定特征:Growable和Shrinkable. Growable意味著可以使用運算子來增加集合 =,而Shrinkable意味著可以使用-=運算子來減少集合。
附帶說明一下,在不可變集合上使用這些運算子也有一個技巧:您的參考必須宣告為 usingvar以支持重新分配。但是,對于可變集合,您不需要重新分配,因為這些操作由提到的 2 個特征支持,這就是為什么可以使用val.
檢查您的集合是否是這兩個特征之一的實體意味著它是可變的:
val myMap: mutable.Map[String, Int] = mutable.Map(
"Apples" -> 4,
"Pineapples" -> 1,
"Oranges" -> 10,
"Grapes" -> 7
)
val mySet: mutable.Set[Int] = mutable.Set(1, 2, 3)
val myMap2: Map[String, Int] = Map(
"Apples" -> 4,
"Pineapples" -> 1,
"Oranges" -> 10,
"Grapes" -> 7
)
val mySet2: Set[Int] = Set(1, 2, 3)
println(myMap.isInstanceOf[mutable.Growable[_]]) // true
println(myMap2.isInstanceOf[mutable.Shrinkable[_]]) // false
println(mySet.isInstanceOf[mutable.Shrinkable[_]]) // true
println(mySet2.isInstanceOf[mutable.Shrinkable[_]]) // false
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498443.html
