O que podem procs e lambdas fazer que funções não podem em ruby

5

Eu tenho trabalhado em Ruby nas últimas duas semanas, e cheguei ao assunto de procs, lambdas e blocks. Depois de ler uma boa parte dos exemplos de uma variedade de fontes, não sei como elas são muito diferentes das funções pequenas e especializadas. É inteiramente possível que os exemplos que li não estejam mostrando o poder por trás dos procs e lambdas.

def zero_function(x)
    x = x.to_s
   if x.length == 1
    return x = "0" + x
   else
    return x
   end
end

zero_lambda = lambda {|x|
  x = x.to_s
   if x.length == 1
    return x = "0" + x
   else
    return x
   end
}

zero_proc = Proc.new {|x|
  x = x.to_s
   if x.length == 1
    puts x = "0" + x
   else
    puts x
   end
}


puts zero_function(4)
puts zero_lambda.call(3)
zero_proc.call(2)

Esta função, proc e lambda faz exatamente a mesma coisa, apenas ligeiramente diferente. Existe algum motivo para escolher um em detrimento de outro?

    
por SecurityGate 03.10.2012 / 18:08
fonte

3 respostas

4

Primeiro de tudo, o que você quer dizer com "funções"? Proc e lambda são "funções" - e eles avaliam um objeto de função, que poderia ser atribuído a uma variável ou usado em qualquer outra expressão. Não há outra maneira de definir uma "função" não-método em Ruby.

def , por contraste, define um método no módulo atual (você está sempre dentro de algum módulo, seja explicitamente ou implicitamente). Um método é obviamente diferente de uma função vazia, porque um método tem acesso implícito a self e as variáveis de instância de self .

Mais importante, Proc e lambda são closures - eles capturam variáveis locais do escopo anexo onde foram criados, e você pode usar essas variáveis dentro do fechamento. Isso permite que os objetos de função mantenham o estado.

Por outro lado, a definição de um método dentro de outra definição de método não dará acesso às variáveis locais no corpo do método externo. Portanto, é o mesmo que se você movesse a definição interna para fora, exceto que o método definido pelo def interno só existiria depois que o método definido pelo% externodef fosse executado.

    
por 04.10.2012 / 20:57
fonte
0

Boa pergunta! Estou curioso nas respostas.

Uma diferença eu sei:

Você não recebe erros com esta chamada:

zero_proc.call()

Mas você recebe um wrong number of arguments (0 for 1) (ArgumentError) -error com as seguintes chamadas:

puts zero_function()
puts zero_lambda.call()

Os métodos e lambdas verificam o número de parâmetros, os objetos Proc não, o uso nil se houver parâmetros ausentes.

    
por 03.10.2012 / 19:43
fonte
0

A outra grande diferença entre procs, métodos e lambdas é como eles lidam com quebra e retorno.

Basicamente, um retorno em um Proc saltará de qualquer método de inclusão, e um retorno de um lambda só sairá do lambda.

Um intervalo de um Proc tenta interromper uma iteração delimitada (se não houver iteração, você receberá um erro), enquanto um intervalo de um lambda é igual a um retorno.

Mais detalhes aqui: link

    
por 30.06.2015 / 23:02
fonte