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

Eva*_* Y. 0 scala lift

以下定义有什么区别?

1.def debug(msg: => AnyRef) = { println(String.valueOf(msg)) }
2.def debug(msg: () => AnyRef) = { println(String.valueOf(msg)) }
Run Code Online (Sandbox Code Playgroud)

第一个定义可以接受任何东西,字符串或函数等,但第二个定义只能接受函数.我想知道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")
                   ^
Run Code Online (Sandbox Code Playgroud)

Lui*_*hys 5

第一个是按名称调用参数,即每次在方法中使用时都会对参数进行求值,并且只有在使用它时才会对参数进行求值.正如您所发现的那样,这可以是评估所需类型的anthing.

第二个特别是一个Function0[AnyRef]对象.您可以将其()视为一个空参数列表(不要与Unit值相混淆,后者写的相同).