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!

Foi útil?

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 = ()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top