В чем разница двух методов определения? - PullRequest
0 голосов
/ 15 февраля 2012

В чем отличие следующего определения?

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 Ответ

5 голосов
/ 15 февраля 2012

Первый - это параметр call-by-name, т.е. он оценивает аргумент каждый раз, когда он используется в методе, и только если он используется.Как вы обнаружили, это может быть муравейник, который соответствует требуемому типу.

Второй занимает конкретно Function0[AnyRef] объект.Вы можете думать о () как о пустом списке параметров (не путать со значением Unit, которое написано так же).

...