Ad esempio, la presenza o l'assenza di do
nel seguente codice influisce sul comportamento del programma?Quando è richiesta la parola chiave do in Ruby?
while true do
puts "Hi"
break
end
while true
puts "Hi"
break
end
Ad esempio, la presenza o l'assenza di do
nel seguente codice influisce sul comportamento del programma?Quando è richiesta la parola chiave do in Ruby?
while true do
puts "Hi"
break
end
while true
puts "Hi"
break
end
Secondo The Ruby Programming Language libro Sezione 5.2.1:
Il
do
parola chiave in un ciclowhile
ountil
è come la parola chiavethen
in una dichiarazioneif
: può essere omesso del tutto il più a lungo appare una nuova riga (o il punto e virgola ) tra la condizione di loop e il corpo del loop.
Quindi, no, non cambierà il comportamento, è solo una sintassi opzionale.
Scopriamolo!
Per una risposta rapida possiamo guardare la documentazione di Ruby e trovare http://www.ruby-doc.org/core-2.1.1/doc/syntax/control_expressions_rdoc.html#label-while+Loop cui si afferma che
Il DO parola chiave è opzionale.
Ok, quindi questi due esempi sono equivalenti ma sono identici? Potrebbero fare la stessa cosa, ma forse c'è un motivo per preferire l'uno rispetto all'altro. Possiamo guardare l'AST che questi esempi generano e vedere se c'è qualche differenza.
> 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)
No. Questi due esempi eseguono esattamente le stesse istruzioni in modo da poter scegliere qualsiasi stile che troviamo più facile da leggere. Una preferenza comune è quella di omettere lo do
quando possibile: https://github.com/bbatsov/ruby-style-guide#no-multiline-while-do
Questo è interessante (devo guardare 'ruby_parser'), ma inutilmente difficile da leggere con tutti i prompt di' irb'. Ti suggerisco di rimuoverli. –
@CarySwoveland è possibile modificare i prompt e aiutare questa domanda a essere più bella. – DiegoSalazar
@ diego.greyrobot, non ho quasi mai modificato ciò che altri hanno scritto. Come la vedo io, possiedono le parole, quindi non posso fare altro che suggerire dei cambiamenti. (Molto vecchia scuola, lo so.) Riesci a indovinare la mia reazione quando gli altri pubblicano ciò che ho scritto? :-) –