2012-01-29 81 views
3
占位问题

考虑斯卡拉如下定义:关于斯卡拉

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

代码分配到F函数字面_ + 1,这是很自然的,除了字符串表示,这不是我想要的。我打算定义一个接受int参数的函数,将其加1并返回其字符串格式。

消除歧义,我必须写一个lambda表达式有明确参数:

val g = (x: Int) => (x + 1).toString() 

因此我可以断定,占位符语法不适合复杂的函数文本? 或者是否存在一些规定函数文字范围的规则?这似乎占位符不能嵌套在括号(除了需要用于定义其类型的那些)功能字面

回答

7

是的,你认为占位符语法除简单函数文字之外无用。

值得一提的是,您提到的特定情况可以用占位符语法和函数组合的联合来编写。

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

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

谢谢。那么我也在寻找什么。我曾预料过类似于Haskell中的点运算符,但什么也没有发现。 – weidi 2012-01-29 12:18:05

+2

@weidi,'Function1#compose'相当于Haskell中的'.'。但是由于Scala的从左到右的流式推理,“Funtion1#和Then”使用起来更方便。 – missingfaktor 2012-01-29 12:51:22

3

似乎占位符不能嵌套在括号内(除了需要用于定义其类型的那些)的函数文本内

这是正确的。请参阅placeholder syntaxuse case example的规则。

+0

谢谢。这些参考文献帮助很多 – weidi 2012-01-29 12:15:49