2010-01-18 66 views

回答

27

在我看来,如果你想使事情变得更加清晰最好是通过添加类型注释存在,而不是函数的结果是记录这个标识符x的期望。

val x:() => Long =() => System.currentTimeMillis

然后编译器将确保右边的函数满足这个期望。

+0

不确定你的意思是*左边的函数符合期望值*,设置结果块的类型也确保了类型是正确的,例如, 'val x =()=> {System.currentTimeMillis}:String'不能编译。或者你的意思是别的吗? – 2010-01-18 19:27:39

+0

杰夫的答案有一个好处,就是您可以预先获得完整类型。如果你有一个很长的(多行)函数定义,那么如果这个类型在开始的时候,它是理解最快的。 Fabian的答案具有重复性较低的优点(尤其适用于简短的(单行)定义,并且可以更快地理解您是否可以一眼看出整个事物)。 – 2010-01-18 19:41:11

+0

哦,现在我看到Geoff的观点,他的类型定义包含了输入类型,这里是'()',并且当函数'()=> System.currentTimeMillis'被赋值给'x'时被检查。 – 2010-01-18 19:46:15

37
val x =() => { System.currentTimeMillis } : Long 
+0

这解决了我的问题。这使得比使用函数#方法少得多。 – 2010-09-29 23:28:07

+0

看起来像'val x =()=> Long = {blah}'是一种更直观的语法。感谢你的回答! – wbarksdale 2012-09-26 18:49:51

9

的Fabian给了直截了当的方式,但如果你的一些其他的方法一样事无巨细糖包括:

val x = new (() => Long) { 
    def apply() = System.currentTimeMillis 
} 

val x = new Function0[Long] { 
    def apply() = System.currentTimeMillis 
} 

甚至

val x = new { 
    def apply(): Long = System.currentTimeMillis 
} 
因为

大多数情况下,它如果它从Function下降,则无关紧要,只有它是否适用。

相关问题