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

时间:2012-02-15 01:35:18

标签: scala lift

以下定义有何不同?

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")
                   ^

1 个答案:

答案 0 :(得分:5)

第一个是按名称调用参数,即每次在方法中使用时都会计算参数,并且只有在使用它时才会计算参数。正如您所发现的,这可能是一种评估为所需类型的anthing。

第二个具体使用Function0[AnyRef]个对象。您可以将()视为空参数列表(不要与Unit值混淆,后者写的相同)。