Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在带有通配符的匿名函数中使用括号_Scala_Anonymous Function - Fatal编程技术网

Scala 在带有通配符的匿名函数中使用括号

Scala 在带有通配符的匿名函数中使用括号,scala,anonymous-function,Scala,Anonymous Function,我目前正在学习Scala,正在使用带有通配符的匿名函数。这对我来说很有意义: // Creates function operation(a, b, c) => a + (b / c) var operation = (_:Double) + (_:Double) / (_:Double) 我不明白的是如何更改操作以返回(a+b)/c。这些都不起作用: // Attempting to create function operation(a, b, c) => (a + b) /

我目前正在学习Scala,正在使用带有通配符的匿名函数。这对我来说很有意义:

// Creates function operation(a, b, c) => a + (b / c)
var operation = (_:Double) + (_:Double) / (_:Double)
我不明白的是如何更改
操作
以返回
(a+b)/c
。这些都不起作用:

// Attempting to create function operation(a, b, c) => (a + b) / c
var operation = ((_:Double) + (_:Double)) / (_:Double)
// error: value / is not a member of (Double, Double) => Double
var operation = ((_:Double) + (_:Double)).toDouble / (_:Double)
// error: value toDouble is not a member of (Double, Double) => Double

我猜这是因为将
(:Double)+(:Double)
放在括号中会将其转换为
(Double,Double)=>Double
函数类型。但我该如何改变操作顺序呢?这可能吗?

因为
+
只是Scala中的另一种方法,您可以这样做,就像使用
调用另一种方法一样:

var operation = (_: Double).+(_: Double) / (_: Double)

然而,在我看来,下划线应该只用于微小的、无关紧要的函数(如
foo.reduce(^ 41;
)。如果您需要使用类型归属并使用语法玩游戏,那么最好将该函数转换为
(a:Double,b:Double,c:Double)=>(a+b)/c
,或者更好地将其作为一种方法。另一件事-在Scala中,
val
(不可变)优于
var
(可变)。如果可能,请使用前者。

AFAIK是不可能的,这是一件好事,因为这将阻止您使用下划线语法,这是一件好事。这可能是给初学者和专家带来更多麻烦的特性之一。它只对
.map(u.foo)
.reduce(u+)
@LuisMiguelMejíaSuárez这样的小函数有用。这是可能的,但是的,仅仅因为你能做某事并不意味着你应该做。我自己尽量避免使用下划线。