例如,我有2个方法定义如下,有或没有括号。
WIP
在方法参数的情况下,我可以为两者创建更高阶的函数,如下所示:
def foo1: String = "bar"
def foo2():String = "bar"
但是如果是def bar(fn: =>String) = ??? // bar(foo1)
def bar(fn: ()=>String) = ??? // bar(foo2)
,我只能使用generic type
。
foo2
以下不起作用。
val list: List[() => String] = List(foo2)
所以,我的问题是无参数和无括号方法的正确类型定义是什么?
答案 0 :(得分:2)
bar def bar(fn: => String) = ???
的第一个定义没有描述没有参数的函数参数,它描述了一个惰性参数。
因此,如果你有一个产生字符串的函数,并且你希望推迟执行这个函数,你可以将它作为一个惰性参数传递给你的函数。这允许函数bar
在这种情况下执行函数并生成String
,或者将此代码传递给另一个函数。以if语句为例,它接受2个函数,并且只根据谓词执行其中的1个。
现在回答您的问题,您可以使用_
符号将您的方法转换为函数(eta扩展),也可以使用lambda表示法手动使foo
成为功能
def foo1 = "bar"
val list: List[() => String] = List(foo1) // crashes since foo1 is not a fn its
// just a string
val list: List[() => String] = List(() => foo1) // works
val foo1Eta = foo1 _
val list: List[() => String] = List(foo1Eta) // works
val foo2 = () => "bar"
val list: List[() => String] = List(foo2) // works
def foo3 = () => "bar"
val list: List[() => String] = List(foo3) // also works
答案 1 :(得分:1)
要将无参数def作为函数参数传递,需要将其转换为函数。您可以使用以下语法执行此操作:
val list: List[() => String] = List(foo1 _)