2015-01-01 23 views
0

什么是=>运营商的链接的意义就像这个代码:在Scala的函数文字中,链接=>(向右双箭头)运算符的含义是什么?

val a = Array("I", "love", "Scala Johnson") 
a.foreach { 
    x => y: String => println(x) 
} 

它打印出来罢了。

那么发生了什么? x汇编失败了吗?

如果我删除从y参数String类型声明:

x => y => println(x) 

"missing parameter type"编译错误。

然后我做了一个实验:

val hotFunc: Int => Int => Unit = x => y => println(x * y) 
hotFunc(2)(11) 

它打印出来22

那么,=>的链接是否意味着咖喱?

UPDATE:

第三案:

def readFile[T](f: File)(handler: FileInputStream => T): T = { 
    val resource = new java.io.FileInputStream(f) 
    try { 
     handler(resource) 
    } finally { 
     resource.close() 
    } 
} 

val bs = new Array[Byte](4) 

readFile(new File("Slurp.scala")) { 
    input => b: Byte => println("Read: " + (input.read(bs) + b)) 
} 

这同样与第1例,打印出来罢了。

回答

0

=>是正确的关联,所以在你的第一个例子中,你正在呼吁与a的值,它会返回一个功能String=>Unit功能(但从来没有被抓住,获得隐式转换为Unit因为foreach)。也许它会更清楚用括号:

x => ((y: String) => println(x)) 

其转向

x => ((y: String) => println(x);()) 

foreach,因为它需要T => Unit

链接=>(没有括号)是一种咖啡,是的。

+0

谢谢,但我仍然有点困惑。请看第三个例子,那里发生了什么? – null

+0

@suud你还没有调用返回的'Byte => Unit'函数,所以这也是第三个例子的预期行为(我认为它在你可以读之前关闭了流,所以调用该函数很可能会导致' IOException')。 –

+1

好吧,我现在明白了。 'readFile'返回一个函数值('b:Byte => println(“Read:”+(input.read(bs)+ b)',类型为Byte => Unit),它不执行函数值内部的代码,这就是为什么没有打印出来。 – null

相关问题