在带通配符的匿名函数中使用括号
Using Brackets in Anonymous Functions with Wildcards
我目前正在学习 Scala,并且正在研究使用 _
通配符的匿名函数。这对我来说是有道理的:
// Creates function operation(a, b, c) => a + (b / c)
var operation = (_:Double) + (_:Double) / (_:Double)
我不明白如何将 operation
改为 return (a + b) / c
。 None 这些作品:
// 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(_ ^ _)
)。如果您需要使用类型归属和玩语法游戏,最好将该函数变成 (a: Double, b: Double, c: Double) => (a + b) / c
,或者更好,将其变成一个方法。另一件事 - 在 Scala 中,val
(不可变)优于 var
(可变)。请尽可能使用前者。
我目前正在学习 Scala,并且正在研究使用 _
通配符的匿名函数。这对我来说是有道理的:
// Creates function operation(a, b, c) => a + (b / c)
var operation = (_:Double) + (_:Double) / (_:Double)
我不明白如何将 operation
改为 return (a + b) / c
。 None 这些作品:
// 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(_ ^ _)
)。如果您需要使用类型归属和玩语法游戏,最好将该函数变成 (a: Double, b: Double, c: Double) => (a + b) / c
,或者更好,将其变成一个方法。另一件事 - 在 Scala 中,val
(不可变)优于 var
(可变)。请尽可能使用前者。