在Scala中考虑以下定义:
val f = ((_: Int) + 1).toString()
代码为f指定函数文字_ + 1的字符串表示,这很自然,除了这不是我想要的。我打算定义一个接受int参数的函数,将其递增1,并返回其字符串格式。
要消除歧义,我必须编写一个带有显式参数的lambda表达式:
val g = (x: Int) => (x + 1).toString()
那么我可以得出结论:占位符语法不适用于复杂的函数文字吗? 或者是否有一些规则说明函数文字的范围?似乎占位符不能嵌套在函数文字中的括号中(除了定义其类型所需的除外)
答案 0 :(得分:7)
是的,你认为占位符语法除了简单的函数文字之外没有用处,你是对的。
对于它的价值,你提到的特定情况可以用占位符语法和函数组合的结合来编写。
scala> val f = ((_: Int) + 1) andThen (_.toString)
f: Int => java.lang.String = <function1>
scala> f(34)
res14: java.lang.String = 35
答案 1 :(得分:3)
似乎占位符不能嵌套在函数文字中的括号中(除了定义其类型所需的除外)
这是对的。请参阅placeholder syntax和use case example的规则。