Используйте регистр и примеры для образца типа с переменной типа

Я узнал, считывая спецификацию, что 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 объект определенного класса? Какой лучший способ проверить, содержит ли NSAray объект определенного типа класса? containsObject: кажется, проверяет равенство, тогда как я ищу isKindOfClass: проверка равенства.

Какой способ лучше всего проверить, содержит ли NSAray объект определенного типа класса? containsObject: , кажется, проверяет равенство, в то время как я ищу проверку равенства isKindOfClass: .

18
задан Abizern 6 September 2011 в 01:16
поделиться