如何使用无括号的无参数方法作为类型参数?

时间:2018-01-11 06:02:31

标签: scala generics

例如,我有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)

所以,我的问题是无参数和无括号方法的正确类型定义是什么?

2 个答案:

答案 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 _)