Scala: Como “store” uma função em uma var?
-
05-07-2019 - |
Pergunta
Estou aprendendo Scala e estou tentando armazenar uma função em uma var para avaliá-lo mais tarde:
var action:() => Any = () => {}
def setAction(act: => Any) {
action = act
}
mas isso não compila:
erro: incompatibilidade de tipo;
encontrado: Qualquer
exigida: () => Qualquer
action = ato
Assim, parece-me que em action = act
em vez de atribuir a função é avaliá-la e atribuir o resultado.
Eu não consigo descobrir como atribuir a função sem avaliá-lo.
Obrigado!
Solução
tipo de nota "() => Qualquer" não é o mesmo que por nome parâmetro "=> Qualquer". Tipo "() => Qualquer" é uma função que leva nenhum parâmetro e retorna qualquer, enquanto parâmetro by-name "=> Qualquer" atrasos de execução do parâmetro até que ele é usado e retorna qualquer.
Então, o que você precisa fazer aqui é o seguinte:
var action: () => Any = null
def setAction(act: => Any) = action = () => act
setAction(println("hello")) // does not print anything
action() // prints "hello"
setAction(123)
action() // returns 123
Outras dicas
Eu acho que você é declaração de parâmetro está errado. Este é provavelmente o que você quer se você simplesmente deseja armazenar uma função em uma var para uso posterior:
def setAction(act:() => Any) {
action = act
}
e, em seguida:
scala> def p() { println("hi!") }
p: ()Unit
scala> setAction(p)
scala> action()
hi!
res2: Any = ()