2011-11-20 48 views
2

我是新来的斯卡拉很抱歉,如果这很容易,但我很难找到答案。一些操作员问题

我很难理解什么< - 做,什么()=>单位。我对这些的理解是 - >有时用在foreach中,而那个=>用在地图中。尝试谷歌“斯卡拉” < - ”不能证明卓有成效我发现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

你看过http://docs.scala-lang.org/tutorials/FAQ/finding-symbols.html吗? – soc

回答

5

() => Unit表示方法是,它没有的功能。参数,并且没有返回(Unit)。

<-在使用理解为一种分配运算符。理解力都有点特殊,因为它们在内部转换。在你的情况,这将是转换为numbers.foreach(i => println(i + ": came out of this crazy thing!"))

<-在for理解中意味着我们将遍历numbers列表的每个元素并传递给number

+0

谢谢,这确实有很大的帮助。现在我得到我们定义了什么tweener接受作为一个函数称为方法,但为什么我们需要指定它什么都不返回?如果我只是把def tweener(方法:()),但我不明白为什么,我会得到有关括号的错误。我也得到< - 现在,谢谢! – user1054583

+0

,因为'Unit'意味着什么:-)它是一种用C或Java语言知道的类型化的“void”。 – David

+0

@ user1054583我对“没什么”提出疑问。 Scala中什么都不返回:除非不返回,否则一切都会返回一些东西,但会抛出一个异常(像'sys.error',其返回类型是'Nothing')。现在,有时候你对返回的内容不感兴趣,那就是'Unit'的意思是:它是一种具有单一值的类型 - '()' - 你简单地忽略它。 –

4

“< - ”可“在”被threated为使

for(number <- numbers){ 
... 
} 

可以翻译成英文在数字每个号码做

“< - ”有带双不同的语义:' - >'。简单地说,它仅仅是元组中逗号的替换:(a,b)等价于(a-> b)或者仅仅是a-> b。这个符号之后的含义是''映射到'b'。因此,这是经常被用来在地图的定义:

Map("a" -> 1,"aba" -> 3) 
Map("London" -> "Britain", "Paris" -> "France") 

在这里,你可以考虑一下映射,通过一些功能(如“字符串的长度”,“资本”)的投影(或没有)。

更好的解释是here

最后但并非最不重要的是'=>',它也是地图,但具有一般的语义。 “=>”正在使用遍布匿名表达式的地方:

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

+0

谢谢你的< - 解释,这真的有助于清除它!对于def tweener(方法:()=> Unit)我很难理解除了接受方法之外它做了些什么(我明白了这一点!)。感谢您的解释,但我想我必须扼制我对普通可怜的scala foo的持续缺乏理解 – user1054583

3

在该方法中元件

def tweener(method:() => Unit) { 
    method() 
} 

方法被调用tweener,参数任意命名method,和method类型为() => Unit,这是一个函数类型,因为你可以从=>告诉。

Unit是一种类似于Java中void的返回类型,并且表示没有有趣的值被返回。例如,返回类型printUnit()代表一个空的参数列表。

混淆,()也用来代表的Unit一个实例,叫做单元值,一个Unit可以采取仅值。但是,这是而不是它在功能类型() => Unit中意味着什么,就像您不能具有功能类型42 => Unit一样。

回到你的例子tweener需要函数类型() => UnitoperateOnList方法,但它被编译器部分应用以将其变成函数值。你可以把方法变成自己的功能像这样:

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