我是斯卡拉的新手很抱歉,如果这很容易,但我很难找到答案。
我很难理解< - does,what()=>单位呢。我对这些的理解是 - >有时在foreach中使用,并且=>用于地图。试图谷歌“scala”< - “并不能证明是非常有成效的。我发现http://jim-mcbeath.blogspot.com/2008/12/scala-operator-cheat-sheet.html但它没有像第一眼看上去那样有用。
val numbers = List("one", "two", "three","four","five")
def operateOnList() {
for(number <- numbers) {
println(number + ": came out of this crazy thing!")
}
}
def tweener(method: () => Unit) {
method()
}
tweener(operateOnList)
答案 0 :(得分:5)
() => Unit
表示该方法是一个不带参数且不返回任何内容的函数(Unit
)。
<-
在for comprehension中用作一种赋值运算符。理解是有点具体的,因为它们是内部转化的。在您的情况下,这将转换为numbers.foreach(i => println(i + ": came out of this crazy thing!"))
<-
意味着我们将迭代numbers
列表的每个元素并传递给number
。
答案 1 :(得分:4)
'&lt; - '可以被改为'in'所以
for(number <- numbers){
...
}
可以翻译成英文,因为为数字中的每个数字
'&lt; - '有一个具有不同语义的双胞胎:' - &gt;'。简单地说,它只是元组中逗号的替换:(a,b)等同于(a-> b)或只是a-&gt; b。此符号后面的含义是'a'将映射到'b'。因此,这通常用于地图的定义:
Map("a" -> 1,"aba" -> 3)
Map("London" -> "Britain", "Paris" -> "France")
在这里,您可以考虑通过某种函数(或“字符串长度”,“资本”)将映射作为投影(或不投影)。
更好的解释是here。
最后,但并非最不重要的是'=&gt;'这也是地图,但具有一般语义。 '=&GT;'在匿名表达中遍布使用:
scala> List(1,2,3,4).map(current => current+1)
res5: List[Int] = List(2, 3, 4, 5)
对于列表中每个元素映射当前元素的,其函数为“加一”
List(1,2,3,4).map(c => c%2 match {
| case 0 => "even"
| case 1 => "odd"
| }
| )
res6: List[java.lang.String] = List(odd, even, odd, even)
使用提供的模式mathing
映射当前元素答案 2 :(得分:3)
方法
def tweener(method: () => Unit) {
method()
}
该方法名为tweener
,参数任意命名为method
,method
的类型为() => Unit
,这是一种函数类型,如您所知来自=>
。
Unit
是类似于Java中的void
的返回类型,并且表示没有返回有趣的值。例如,print
的返回类型为Unit
。 ()
表示空参数列表。
令人困惑的是,()
也用于表示Unit
的实例,称为单位值,是Unit
唯一可以采用的值。但这是不在函数类型() => Unit
中的含义,就像你没有函数类型42 => Unit
一样。
回到您的示例,tweener
采用() => Unit
类型的功能。 operateOnList
是一个方法,但它会被编译器部分应用,将其转换为函数值。您可以自己将方法转换为函数:
scala> def m = println("hi")
m: Unit
scala> m _
res17: () => Unit = <function0>
operateOnList
可以转换为正确的函数类型,因为它的参数列表为空()
,其返回类型是隐含Unit
。
作为旁注,如果在没有空参数列表的情况下定义operateOnList
(合法,但在返回类型不是Unit时更常见),则需要手动部分应用它,否则值将被传递:
def f1() {}
def f2 {}
def g(f: () => Unit) {}
g(f1) // OK
g(f2) // error, since we're passing f2's result (),
// rather than partial function () => Unit
g(f2 _) // OK