scala – 将一个函数中的一个有条件地应用于一个参数

前端之家收集整理的这篇文章主要介绍了scala – 将一个函数中的一个有条件地应用于一个参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个带有一个参数的函数,一个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")
                         ^

我试着写foo_但当然我得到了错误:找不到:值foo_.在Scala中表达这个成语的正确方法是什么?

解决方法

方法名称和下划线之间需要一个空格.这很好用:

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

猜你在找的Scala相关文章