2017-10-04 65 views
2

我有两个函数声明为VAL两个功能VAL声明给出了两个不同的结果

val add2: (Int, Int) => Int = (x,y) => { 
    println("add2 called") 
    x + y 
} 

val add3: (Int, Int) => Int = { 
    println("add2 called") 
    _ + _ 
} 

当我尝试运行他们,我得到两个不同的结果

add2(1,2) 
add2 called 
res7: Int = 3 

add3(1,2) 
res8: Int = 3 

我不明白为什么这两个函数会给出不同的结果。

也许我误表了自己。在第一种情况下,在第二种情况下没有副作用。但我收到两个变量具有不同功能

+0

你确定它提供了不同的结果吗? – Pavel

+0

结果是一样的吗? –

+0

在第一种情况下,我打印字符串在第二个不 –

回答

5

第一语法val add2: (Int, Int) => Int = (x,y) => ...正在申报的尸体是一个函数:

println("add2 called") 
x + y 

时间的函数被调用println执行接着返回的值的代码块的x + y

第二语法声明了一个匿名函数作为结果/值:

{ 
    println("add2 called") 
    _ + _ 
} 

的代码块的值只是最后一行:_ + _println在时刻当正在分配add3执行只有一次

认为相同的方式,这个片段的第二示例的分配值42到x

val x = { 
    println("Calculating") 
    val a = 21 
    val b = 21 
    a + b 
} 

澄清:

两种语法在共同拥有这一部分:val add: (Int, Int) => Int = ...即类型声明“这将是一个函数,需要两个Ints并返回一个Int”,让我们来看看不同的位:

第一个指定... = (x,y) => { ... }即指定使用=>运算符声明的函数。

第二个示例分配块... = { ... }的值,其中块(它的最后一行)的值是使用one Scala's uses for underscores的匿名函数。

+0

在这里不明确。编译器如何决定在第一种情况下他具有完整的函数体,但在第二种情况下,他必须只返回结果。只有通过匿名声明? –

+0

我有刺伤加入一些澄清。让我知道这是否有帮助! – mikej

+1

非常感谢您的帮助。问题已关闭。 –

相关问题