一些操作员问题

时间:2011-11-20 21:08:28

标签: scala

我是斯卡拉的新手很抱歉,如果这很容易,但我很难找到答案。

我很难理解< - 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)

3 个答案:

答案 0 :(得分:5)

() => Unit表示该方法是一个不带参数且不返回任何内容的函数(Unit)。

<-在for comprehension中用作一种赋值运算符。理解是有点具体的,因为它们是内部转化的。在您的情况下,这将转换为numbers.foreach(i => println(i + ": came out of this crazy thing!"))

for comprehension中的

<-意味着我们将迭代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,参数任意命名为methodmethod的类型为() => 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