在Scala 2.8中,有一个对象scala.collection.package.scala:
def breakOut[From, T, To](implicit b : CanBuildFrom[Nothing, T, To]) =
new CanBuildFrom[From, T, To] {
def apply(from: From) = b.apply() ; def apply() = b.apply()
}
Run Code Online (Sandbox Code Playgroud)
我被告知这会导致:
> import scala.collection.breakOut
> val map : Map[Int,String] = List("London", "Paris").map(x => (x.length, x))(breakOut)
map: Map[Int,String] = Map(6 -> London, 5 -> Paris)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么breakOut被称为我的论据List?
我最近参加了一个初学者Scala聚会,我们正在谈论方法和功能之间的区别(这里也进行了深入讨论).
例如:
scala> val one = 1
one: Int = 1
scala> val addOne = (x: Int) => x + 1
addOne: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
这表明val不仅可以具有整数类型,而且可以具有函数类型.我们可以在scala repl中看到类型:
scala> :type addOne
Int => Int
Run Code Online (Sandbox Code Playgroud)
我们还可以在对象和类中定义方法:
scala> object Foo {
| def timesTwo(op: Int) = op * 2
| }
defined module Foo
Run Code Online (Sandbox Code Playgroud)
虽然方法没有类型(但是具有类型签名),我们可以将其提升为函数以查看它是什么:
scala> :type Foo.timesTwo
<console>:9: error: missing arguments for method timesTwo in object Foo;
follow this method with `_' if you want to treat …Run Code Online (Sandbox Code Playgroud)