我正在通过Odersky的ScalaDays 2011主题演讲,当我到达这个特定的行(分配charCode)时,他在非常少的代码行中构建了一个电话号码同义词生成器:
val mnem: Map[Char, String] = // phone digits to mnemonic chars (e.g. '2' -> "ABC")
val charCode: Map[Char, Char] = for ((digit, str) <- mnem; letter <- str)
yield (letter -> digit) // gives ('A', '2'), ('B', '2') etc
Run Code Online (Sandbox Code Playgroud)
为什么是charCode类型Map?
当我在其他例子中产生元组时,我只获得一系列元组 - 而不是地图.例如:
scala> for (i <- 1 to 3) yield (i -> (i+1))
res16: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,2), (2,3), (3,4))
Run Code Online (Sandbox Code Playgroud)
可以轻松地将其转换为地图toMap(),就像这样......
scala> (for (i <- 1 to …Run Code Online (Sandbox Code Playgroud) 如何使用"匹配"语句来标识类变量的值?以下是无效的,我找不到一个可接受的变体 - 除了if ... else if ... else ...
val c: Class[_] = classOf[Int]
val what = c match { case classOf[Int] => "int!"; case classOf[Float] => "float!" }
Run Code Online (Sandbox Code Playgroud)
编译器抱怨: error: not found: type classOf
当然,我无法使用,Class[Int]因为该类型信息被删除:
c match { case Class[Int] => "int!"; case Class[Float] => "float!" }
error: type Class of type Class does not take type parameters.
Run Code Online (Sandbox Code Playgroud)
我也试过各种变体Int.class,但都无济于事.(而且我真的不想转换为字符串:我觉得让编译器捕获重命名/移动的类非常重要.)
我是否密集,或者我偶然发现斯卡拉盲点?
如何创建一个在Scala中对任何数字类型进行数学和比较的类?
一个明显的方法:
import math.Numeric.Implicits._
class Ops[T : Numeric] {
def add(a: T, b: T) = a + b
def gt(a: T, b: T) = a > b
}
Run Code Online (Sandbox Code Playgroud)
让我知道这个......
Ops.scala:7: value > is not a member of type parameter T
Run Code Online (Sandbox Code Playgroud)
嗯......我们可以用数字类型做数学,但我们无法比较它们?
所以我们也说T是Ordered[T]......
class Ops[T <: Ordered[T] : Numeric] {
def add(a: T, b: T) = a + b
def gt(a: T, b: T) = a > b
}
Run Code Online (Sandbox Code Playgroud)
编译.但尝试使用它?
new Ops[Int].gt(1, 2)
Run Code Online (Sandbox Code Playgroud)
我明白了......
Ops.scala:13: …Run Code Online (Sandbox Code Playgroud)