У меня есть этот код:
Scala:
object C extends App{ def a(): Unit ={ println("a") } val b=a }
f #:
let a=printfn "%A" "a" [<EntryPoint>] let main argv = let b=a 0 // return an integer exit code
Я хочу передать функцию только как значение a,не запускать его.Почему, когда я запускаю программу, я записываю в консоль "a"?
a
В коде Scala a() - это метод.Как таковой он не может быть передан в качестве аргумента или назначен как значение, но он может быть настроен на функцию через eta-extension , которую можно передать в качестве аргумента и /или присваивается как значение.
a()
val b = a _
В дополнение к ответу jwvh, дух вашего кода F # может быть более точно представлен путем определения a как функции вместо метода:
val a = () => println("a") val b = a
Это будет работать как задумано,расширение eta не требуется.
Если вы хотите, чтобы a была функцией, вам нужно задать ей параметры:
let a () = printfn "%A" "a"
, затем вызвать ее в main:
main
let main argv = let b = a () 0 // return an integer exit code
b оценивается при достижении этой строки вашего кода.
b
попробуйте вместо этого использовать lazy. это вычислит значение b только при его вызове.
lazy
object C extends App{ def a(): Unit ={ println("a") } lazy val b = a // Nothing will happen here b // Now "a" will be printed }