Я узнал, считывая спецификацию, что scala поддерживает привязку переменных типа при выполнении сопоставления образца типа:
Map(1 -> "one", 2 -> "two") match {
case l: Map[k, v] =>
// binds k to Int and v to String
// k and v are types as shown here:
val i: Iterator[Tuple2[k, v]] = l.iterator
println(i.mkString(", "))
}
Есть ли какие-либо интересные вещи или практические вещи, которые я могу сделать с этим? Или привязка переменных типа полезна только для целей документации по типу?
Мне пришло в голову, что Scala иногда нуждается в аннотациях типа, таких как определение функции, поэтому я попытался:
def prepender(obj: Any) = obj match {
case xs: List[a] => (x: a) => x :: xs
case opt: Some[a] => (x: a) => x :: Nil
}
Но тогда тип возвращаемой функции странный:
prepender: (obj: Any)a with a => List[Any] forSome { type a; type a }
scala> val p = prepender(List(1,2))
p: a with a => List[Any] forSome { type a; type a } = <function1>
scala> p(1)
<console>:10: error: type mismatch;
found : Int(1)
required: a(in value res7) with (some other)a(in value res7) where
type (some other)a(in value res7), type a(in value res7)
-121--1084583- Какой способ лучше всего проверить, содержит ли NSAray объект определенного типа класса? containsObject:
, кажется, проверяет равенство, в то время как я ищу проверку равенства isKindOfClass:
.