Scala中关于占位符的问题

3

考虑以下Scala中的定义:

val f = ((_: Int) + 1).toString()

代码将函数文字表达式 _+1 的字符串表示分配给 f,这很自然,但这不是我想要的。我希望定义一个接受 int 参数、将其增加 1 并返回其字符串格式的函数。
为了消除歧义,我必须编写一个带有明确参数的 Lambda 表达式:
val g = (x: Int) => (x + 1).toString()

那么我可以得出结论,占位符语法不适用于复杂的函数文字吗?或者有没有规则说明函数文字的范围?似乎在函数文字内,占位符不能嵌套在括号中(除了定义其类型所需的括号)。
2个回答

7

是的,你想得没错,占位符语法除了简单的函数字面量之外并没有什么用处。

不过,值得一提的是,你提到的这种情况可以使用占位符语法和函数组合的结合来实现。

scala> val f = ((_: Int) + 1) andThen (_.toString)
f: Int => java.lang.String = <function1>

scala> f(34)
res14: java.lang.String = 35

谢谢。andThen也是我正在寻找的。我原本期望类似于Haskell中的点运算符,但是没有找到。 - weidi
2
@weidi,Function1#compose 相当于 Haskell 中的 .。但是由于 Scala 的从左到右流动类型推断,使用 Funtion1#andThen 更加方便。 - missingfaktor

3

似乎在函数字面量内,占位符不能嵌套在括号中(除了为定义类型所需的括号)。

这是正确的。请参阅占位符语法规则和用例示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接