我有两个带有一个参数的函数,一个String.我根据某些条件申请其中一个或另一个.这就是我的尝试:
def foo(s: String) = { ... } def bar(s: String) = { ... } (if (condition) foo else bar)("baz")
但我收到这样的错误:
<console>:10: error: missing arguments for method foo; follow this method with `_' if you want to treat it as a partially applied function (if (true) foo else bar)("baz") ^
解决方法
方法名称和下划线之间需要一个空格.这很好用:
def foo(s: String) = s + "-FOO" def bar(s: String) = s + "-BAR" val condition = true (if (condition) foo _ else bar _)("baz") // res0: String = baz-FOO
方法名称后面的下划线告诉Scala您希望将该方法作为更高级别的函数传递.根据我的理解,这是一种消除模式是否要将方法作为函数传递或传递没有参数的方法的结果的方法.例如:
def f = 1 val x = Some(f)
x的类型应该是什么?会是某些[Int]还是某些[()=> Int]?它应该默认为前者,但如果你想要后者,你可以使用下划线表示法:
val y = Some(f _)
你必须处理所有这些下划线的废话,因为Scala methods aren’t functions.如果你将foo和bar声明为函数而不是方法,那么你的原始代码按原样运行:
val foo = (s: String) => s + "-FOO" val bar = (s: String) => s + "-BAR" val condition = false (if (condition) foo else bar)("baz") // res1: String = baz-BAR