Ich verwende diesen Code, damit der Benutzer Namen eingeben kann, während das Programm sie in einem Array speichert, bis er eine leere Zeichenfolge eingibt (er muss nach jedem Namen die Eingabetaste drücken):
people = []
info = 'a' # must fill variable with something, otherwise loop won't execute
while not info.empty?
info = gets.chomp
people += [Person.new(info)] if not info.empty?
end
Dieser Code würde in einer do ... while-Schleife viel besser aussehen:
people = []
do
info = gets.chomp
people += [Person.new(info)] if not info.empty?
while not info.empty?
In diesem Code muss ich keiner zufälligen Zeichenfolge Informationen zuweisen.
Leider scheint diese Art von Schleife in Ruby nicht zu existieren. Kann jemand einen besseren Weg vorschlagen, dies zu tun?
loop do; ...; break if ...; end
?Antworten:
VORSICHT :
Das
begin <code> end while <condition>
wird von Rubys Autor Matz abgelehnt. Stattdessen schlägt er vorKernel#loop
, zHier ist ein E-Mail-Austausch am 23. November 2005, in dem Matz Folgendes feststellt:
RosettaCode Wiki hat eine ähnliche Geschichte:
quelle
begin end while
Methode schien nicht richtig zu sein. Danke, dass du mir das Futter gegeben hast, das ich brauchte, um den Rest des Teams zu überzeugen.Ursprünglich geschrieben von Jeremy Voorhis . Der Inhalt wurde hier kopiert, da er anscheinend von der ursprünglichen Website entfernt wurde. Kopien finden Sie auch im Webarchiv und im Ruby Buzz Forum . - Rechnung die Eidechse
quelle
begin .. end
etwas verpönt ist. Verwenden Sieloop do .. break if <condition>
stattdessen.So was:
Referenz: Ruby's Hidden do {} while () Schleife
quelle
until info.empty?
eher als verwendenwhile not info.empty?
.Wie wäre es damit?
quelle
Hier ist der Volltextartikel von Hubbardrs totem Link zu meinem Blog.
Beim Lesen der Quelle
Tempfile#initialize
in der Ruby- Kernbibliothek habe ich den folgenden Ausschnitt gefunden :Auf den ersten Blick habe ich angenommen, dass der
while
Modifikator vor dem Inhalt von ausgewertet wirdbegin...end
, aber das ist nicht der Fall. Beobachten:Wie zu erwarten, wird die Schleife weiterhin ausgeführt, solange der Modifikator wahr ist.
Ich würde mich freuen, diese Redewendung nie wieder zu sehen,
begin...end
ist aber ziemlich mächtig. Das Folgende ist eine gebräuchliche Redewendung, um eine Einzeilermethode ohne Parameter auswendig zu lernen:Hier ist eine hässliche, aber schnelle Möglichkeit, sich etwas Komplexeres zu merken:
quelle
Das funktioniert jetzt richtig:
Es kann jedoch in Zukunft entfernt werden, da die
begin
Aussage nicht intuitiv ist. Siehe: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745Matz (Ruby's Creator) empfahl dies folgendermaßen:
quelle
Soweit ich weiß, mag Matz das Konstrukt nicht
weil seine Semantik anders ist als
, dass das erste Konstrukt den Code zuerst ausführt, bevor die Bedingung überprüft wird, und das zweite Konstrukt die Bedingung zuerst testet, bevor es den Code ausführt (falls jemals). Ich nehme an, Matz zieht es vor, das zweite Konstrukt beizubehalten, da es mit einem Zeilenkonstrukt von if-Anweisungen übereinstimmt.
Ich habe das zweite Konstrukt selbst für if-Anweisungen nie gemocht. In allen anderen Fällen führt der Computer den Code von links nach rechts (z. B. || und &&) von oben nach unten aus. Menschen lesen den Code von links nach rechts von oben nach unten.
Ich schlage stattdessen die folgenden Konstrukte vor:
Ich weiß nicht, ob diese Vorschläge mit dem Rest der Sprache übereinstimmen. Aber auf jeden Fall bevorzuge ich die Ausführung von links nach rechts sowie die Sprachkonsistenz.
quelle
quelle
while true
kann aber durch ersetzt werdenloop do
.while true
durch ersetzt werdenloop do
. Aber ich habe beide Konstrukte mit vielen Iterationen innerhalb der Schleife getestet und festgestellt, dass dieswhile true
mindestens 2x schneller ist alsloop do
. Kann den Unterschied nicht erklären, aber es ist definitiv da. (Entdeckt beim Testen von Advent of Code 2017, Tag 15.)Hier ist ein anderes:
quelle
unless
vorne ist und ich nicht eine Menge Code durchlese (der mehr sein könnte als hier gezeigt), nur umunless
am Ende ein "Baumeln" zu finden . Es ist ein allgemeines Prinzip im Code, dass Modifikatoren und Bedingungen einfacher zu verwenden sind, wenn sie so "vorne" sind.quelle