Na przykład, czy obecność lub brak do
w poniższym kodzie wpływa w ogóle na zachowanie programu?Kiedy słowo kluczowe "do" jest wymagane w Ruby?
while true do
puts "Hi"
break
end
while true
puts "Hi"
break
end
Na przykład, czy obecność lub brak do
w poniższym kodzie wpływa w ogóle na zachowanie programu?Kiedy słowo kluczowe "do" jest wymagane w Ruby?
while true do
puts "Hi"
break
end
while true
puts "Hi"
break
end
Według The Ruby Programming Language książki sekcji 5.2.1:
do
kluczowe wwhile
lubuntil
pętli jest jakthen
słowa kluczowego wif
stwierdzeniem: to może być całkowicie pominięte, o ile nowa linia (lub średnik ) pojawia się między stanem pętli a ciałem pętli.
Nie, to nie zmieni zachowania, to tylko opcjonalna składnia.
Dowiedz się!
uzyskać szybką odpowiedź możemy spojrzeć na dokumentacji Ruby i wybrać http://www.ruby-doc.org/core-2.1.1/doc/syntax/control_expressions_rdoc.html#label-while+Loop w którym stwierdza, że
Instrukcja do słów kluczowych jest opcjonalna.
OK, więc te dwa przykłady są równoważne, ale czy są identyczne? Mogą zrobić to samo, ale być może istnieje powód, by faworyzować jednego nad drugim. Możemy przyjrzeć się AST, które generują te przykłady i zobaczyć, czy są jakieś różnice.
> gem install ruby_parser
> irb
> require 'ruby_parser'
=> true
> with_do = <<-END
while true do
puts "Hi"
break
end
END
=> "while true do\n puts \"Hi\"\n break\nend\n"
> without_do = <<-END
while true
puts "Hi"
break
end
END
=> "while true\n puts \"Hi\"\n break\nend\n"
> RubyParser.new.parse with_do
=> s(:while, s(:true), s(:block, s(:call, nil, :puts, s(:str, "Hi")), s(:break)), true)
> RubyParser.new.parse without_do
=> s(:while, s(:true), s(:block, s(:call, nil, :puts, s(:str, "Hi")), s(:break)), true)
Nie. Te dwa przykłady wykonują dokładnie te same instrukcje, abyśmy mogli wybrać dowolny styl, który uważamy za łatwiejszy do odczytania. Najczęstszym sposobem jest pominięcie do
, gdy jest to możliwe: https://github.com/bbatsov/ruby-style-guide#no-multiline-while-do
To jest interesujące (muszę przejrzeć 'ruby_parser'), ale niepotrzebnie trudno odczytać wszystkie podpowiedzi' irb'. Proponuję usunąć je. –
@CarySwoveland można edytować monity i pomóc lepiej zadać to pytanie. – DiegoSalazar
@ diego.greyrobot, prawie nigdy nie edytuję tego, co napisali inni. Jak widzę, są właścicielami słów, więc nie mogę nic więcej niż sugerować zmian. (Bardzo stara szkoła, wiem.) Czy potrafisz odgadnąć moją reakcję, gdy inni edytują to, co napisałem? :-) –