Scala 在带有通配符的匿名函数中使用括号
我目前正在学习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) /
// 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这样的小函数有用。这是可能的,但是的,仅仅因为你能做某事并不意味着你应该做。我自己尽量避免使用下划线。