Novo no Ruby, coloque suas luvas de novato.
Existe alguma diferença (obscura ou prática) entre os dois trechos a seguir?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Sei que a sintaxe da chave permite que você coloque o bloco em uma linha
my_array.each { |item| puts item }
mas fora disso, há alguma razão convincente para usar uma sintaxe em vez de outra?
ruby
coding-style
Alan Storm
fonte
fonte
each
funciona com colchetes, mas não comdo
-end
(ruby) , definição de bloco - diferença entredo
end
colchetes e - ? , Bloco de múltiplas linhas Ruby semdo
end
, Qual é a diferença ou valor desses estilos de codificação de bloco em Ruby? e bloco Ruby e argumentos sem parênteses .Respostas:
O livro de receitas Ruby diz que a sintaxe dos colchetes tem ordem de precedência superior
do..end
O segundo exemplo só funciona quando são usados parênteses,
1.upto(3) { |x| puts x }
fonte
Esta é uma pergunta um pouco antiga, mas gostaria de tentar explicar um pouco mais sobre
{}
edo .. end
como foi dito antes
mas como este faz a diferença:
neste caso, o método1 será chamado com o bloco de
do..end
e o método2 será passado para o método1 como um argumento! que é equivalente amethod1(method2){ puts "hi" }
mas se você diz
então o método2 será chamado com o bloco e o valor retornado será passado para o método1 como um argumento. Que é equivalente a
method1(method2 do puts "hi" end)
#### resultado ####
fonte
Geralmente, a convenção é para usar
{}
quando você está fazendo uma pequena operação, por exemplo, uma chamada de método ou uma comparação, etc., então isso faz todo o sentido:Mas se você tiver uma lógica ligeiramente complexa que vai para várias linhas, use
do .. end
como:Basicamente, se sua lógica de bloco vai para várias linhas e não pode ser encaixada na mesma linha, use
do .. end
e se sua lógica de bloco for simples e apenas uma linha simples / única de código, use{}
.fonte
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
pois isso apenas o torna um pouco mais fácil de entender. Mas geralmente evito um desastre de trem.Há dois estilos comuns para a escolha
do end
vs.{ }
para blocos em Ruby:O primeiro e muito comum estilo foi popularizado por Ruby on Rails e é baseado em uma regra simples de linha única vs. multilinha:
{ }
para blocos de linha únicado end
para blocos multilinhasIsso faz sentido porque do / end lê mal em uma linha, mas para blocos de várias linhas, deixar um fechamento
}
pendurado em sua própria linha é inconsistente com tudo o mais que usaend
em ruby, como módulo, definição de classe e método (def
etc .) e estruturas de controlo (if
,while
,case
, etc.)O segundo estilo, visto com menos frequência, é conhecido como semântico, ou " Chaves Weirich ", proposto pelo falecido grande rubista Jim Weirich:
do end
para bloqueios procedurais{ }
para blocos funcionaisIsso significa que quando o bloco é avaliado por seu valor de retorno , ele deve ser encadeado e as
{}
chaves fazem mais sentido para o encadeamento de métodos.Por outro lado, quando o bloco é avaliado quanto aos seus efeitos colaterais , o valor de retorno não tem importância, e o bloco está apenas "fazendo" alguma coisa, então não faz sentido ser encadeado.
Esta distinção na sintaxe transmite um significado visual sobre a avaliação do bloco e se você deve ou não se preocupar com seu valor de retorno.
Por exemplo, aqui o valor de retorno do bloco é aplicado a todos os itens:
No entanto, aqui não está usando o valor de retorno do bloco. Está operando de maneira processual e causando um efeito colateral com isso:
Outro benefício do estilo semântico é que você não precisa alterar os colchetes para fazer / terminar apenas porque uma linha foi adicionada ao bloco.
Como observação, os blocos funcionais coincidentemente são frequentemente de uma linha e os blocos de procedimento (por exemplo, configuração) são multilinhas. Então, seguir o estilo Weirich acaba ficando quase igual ao estilo Rails.
fonte
Usei o estilo Weirich por anos, mas me afastei disso para sempre usar aparelho . Não me lembro de nunca ter usado o estilo de informação do bloco, e a definição é meio vaga. Por exemplo:
São procuduais ou funcionais?
E a contagem de linha é simplesmente inútil na minha opinião. Eu sei, se há uma ou mais linhas, e por que exatamente devo alterar o estilo só porque adicionei ou removi linhas?
fonte