Попробуйте передать функцию в значение, но функция запустится - PullRequest
0 голосов
/ 12 июня 2019

У меня есть этот код:

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"?

Ответы [ 4 ]

3 голосов
/ 12 июня 2019

В коде Scala a() - это метод.Как таковой он не может быть передан в качестве аргумента или назначен как значение, но он может быть настроен на функцию через eta-extension , которую можно передать в качестве аргумента и /или присваивается как значение.

val b = a _
2 голосов
/ 12 июня 2019

В дополнение к ответу jwvh, дух вашего кода F # может быть более точно представлен путем определения a как функции вместо метода:

val a = () => println("a")

val b = a

Это будет работать как задумано,расширение eta не требуется.

2 голосов
/ 12 июня 2019

Если вы хотите, чтобы a была функцией, вам нужно задать ей параметры:

let a () = printfn "%A" "a"

, затем вызвать ее в main:

let main argv = 
  let b = a ()
  0 // return an integer exit code
0 голосов
/ 12 июня 2019

b оценивается при достижении этой строки вашего кода.

попробуйте вместо этого использовать lazy. это вычислит значение b только при его вызове.

object C extends App{
 def a(): Unit ={
  println("a")
 }

 lazy val b = a // Nothing will happen here
 b // Now "a" will be printed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...