2016-12-29 1 views
10

In der Programmiersprache Ruby folgende Arbeiten in irbRubin in Schleifenfehler mit {} Blockbegrenzersignal

for fruit in ['apple', 'banana', 'cherry', 'date'] do 
    puts fruit 
end 

aber dieses nicht

# error 
for fruit in ['apple', 'banana', 'cherry', 'date'] { puts fruit } 

Referenz beachten Sie bitte die folgenden Blockabgrenzern tun nicht Fehler

Edit: Ich denke, was ich beobachte, ist eine Inkonsistenz mit der Art, wie Ende ist Substitution Ed für {} kann jemand erklären warum oder bitte meinen Fehler aufzeigen?

+0

weiß nicht, warum, aber es ist eine ähnliche Einschränkung in 'verfeinern do' auch. –

+0

Wenn es einen Trost gibt, brauchen Sie nicht das Öffnen 'do' in einer' for' Schleife. –

+0

Dies könnte damit zu tun haben, dass 'for' und' while' (die für 'for' agieren) keine Methoden sind. Aber ich warte auf eine formale Begründung. –

Antwort

10

Das folgende Zitat aus this Beitrag die „Widersprüchlichkeit“ gut (Hervorhebung von mir) erklärt:

end ist ein generisches Schlüsselwort, das einen Kontextes Enden (conditionals, Klasse und Moduldefinitionen, Methodendefinitionen, Schleifen und Ausnahme -catching [Aussagen]). Curly geschweifte Klammern sind eine spezielle Syntax zum Definieren von Blöcken oder Hashes.

for Schleifen sind Kontrollstrukturen - nicht Methoden mit einem Block Argument - daher müssen sie mit dem Schlüsselwort end geschlossen werden. Methoden wie und Enumerable#each haben ein Blockargument, das mit einer der Syntaxen { } oder do ... end definiert werden kann.

+0

große Antwort! Vielen Dank. – PrimeLens

0

for ist keine für Object oder Kernel definierte Methode und erwartet keinen Block.

Sie können nicht schreiben:

class A { 
    def method { 
    } 
} 

entweder.

Sie können eine benutzerdefinierte my_for Methode definieren:

module Kernel 
    def my_for(elements, &block) 
    elements.each(&block) 
    end 
end 

my_for ['apple','banana','cherry', 'date'] do |fruit| 
    puts fruit 
end 

my_for ['apple','banana','cherry', 'date'] { |fruit| puts fruit } 
+1

'for ... in' ist ein gültiger Steuerausdruck in Ruby, siehe [Dokumentation] (http://ruby-doc.org/core-2.4.0/doc/syntax/control_expressions_rdoc.html#label-for+ Schleife). – cobaltsoda