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 }
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top