Alguém pode explicar Ruby uso de tubo de caracteres em um bloco?
Pergunta
Alguém pode me explicar Ruby uso de tubo de caracteres em um bloco?Eu entendo que não contém um nome de variável que será atribuída a dados, como ele repete.Mas o que é esse chamado?Pode haver mais de uma variável dentro de tubos?Qualquer coisa que eu deveria saber sobre ele?Todos os links bons para obter mais informações sobre ele?
Por exemplo:
25.times { | i | puts i }
Solução
Os aparelhos definem uma função anônima, chamada de bloco. Os tokens entre o tubo são os argumentos deste bloco. O número de argumentos necessários depende de como o bloco é usado. Cada vez que o bloco é avaliado, o método que exige o bloco passa um valor com base no objeto que o chama.
É o mesmo que definir um método, apenas não é armazenado além do método que aceita um bloco.
Por exemplo:
def my_print(i)
puts i
end
fará o mesmo quando executado:
{|i| puts i}
A única diferença é que o bloco é definido em tempo real e não é armazenado.
Exemplo 2: As seguintes afirmações são equivalentes
25.times &method(:my_print)
25.times {|i| puts i}
Usamos blocos anônimos porque a maioria das funções passadas como um bloco geralmente é específica para sua situação e não vale a pena definir para a reutilização.
Então, o que acontece quando um método aceita um bloco? Isso depende do método. Os métodos que aceitam um bloco o chamarão, passando valores de seu objeto de chamada de uma maneira bem definida. O que é retornado depende do método que requer o bloco.
Por exemplo: em 25.times {|i| puts i}
.Times chama o bloco uma vez para cada valor entre 0 e o valor de seu chamador, passando o valor para o bloco como a variável temporária i. Os tempos retornam o valor do objeto de chamada. Neste caso 25.
Vejamos o método que aceita um bloco com dois argumentos.
{:key1 => "value1", :key2 => "value2"}.each {|key,value|
puts "This key is: #{key}. Its value is #{value}"
}
Nesse caso, cada um chama o bloco para cada par de chave/valor que passa a chave como o primeiro argumento e o valor como o segundo argumento.
Outras dicas
Os tubos especificar argumentos que são preenchidos com os valores que a função que chama o seu bloco.Pode haver zero ou mais deles, e como muitos que você deve usar depende do método de chamada.
Por exemplo, each_with_index utiliza duas variáveis e coloca o elemento em um deles e o índice nas outras.
aqui está uma boa descrição de como blocos e iteradores trabalho
Bloco de argumentos siga todas as mesmas convenções de como os parâmetros do método (pelo menos de 1.9):você pode definir os argumentos opcionais, de comprimento variável arg listas, padrões, etc.Aqui está um bastante decente resumo.
Algumas coisas a ter em consideração:porque blocos de ver, as variáveis no escopo eles foram definidos, se você passar em um argumento com o mesmo nome de uma variável existente, ele será "sombra" é - o bloco vai ver o passado em valor e a variável original permanecerá inalterada.
i = 10
25.times { | i | puts i }
puts i #=> prints '10'
Vai imprimir '10' no final.Porque, às vezes, este é o comportamento desejável mesmo se você não está passando em um valor (ou seja, você deseja certificar-se de que você não acidentalmente espancar uma variável em torno de escopo), você pode especificar bloco-nomes de variáveis locais após um ponto e vírgula após a lista de argumentos:
x = 'foo'
25.times { | i ; x | puts i; x = 'bar' }
puts x #=> prints 'foo'
Aqui, 'x' é o local para o bloco, mesmo que nenhum valor é passado.