2012-02-15 64 views
0

以下定义有什么区别?两种方法定义有什么区别?

1.def debug(msg: => AnyRef) = { println(String.valueOf(msg)) } 
2.def debug(msg:() => AnyRef) = { println(String.valueOf(msg)) } 

的第一个定义可以接受任何事情,字符串或功能等,但第二个只能接受功能。我想知道reazon。

scala> def debug(msg: => AnyRef) = { println(String.valueOf(msg)) } 
debug: (msg: => AnyRef)Unit 

scala> debug("hi") 
hi 

scala> debug(() => "xx") 
<function0> 

scala> def debug(msg:() => AnyRef) = { println(String.valueOf(msg)) } 
debug: (msg:() => AnyRef)Unit 

scala> debug("hi") 
<console>:9: error: type mismatch; 
found : java.lang.String("hi") 
required:() => AnyRef 
       debug("hi") 
       ^

回答

5

首先是一个呼叫按姓名参数,即,其评估所述参数在每次的方法中使用,并且仅在使用它的时间。正如你所发现的,这可以是评估为所需类型的洞穴。

第二个具体是一个Function0[AnyRef]对象。您可以将()视为空白参数列表(不要与Unit值写入相同)混淆。

+1

感谢您告诉我这是一个'按名称'的函数,所以我可以从http://stackoverflow.com/questions/4986557/scala-call-by-name-confusion获得更多细节。 – 2012-02-15 01:59:23

相关问题