Warum manchmal sollte ich Block und andere Zeiten & blockieren innerhalb Funktionen, die Blöcke akzeptieren?Unterschied zwischen Block und & Block in Ruby
Antwort
block
ist nur eine lokale Variable, &block
ist eine Referenz auf den Block, der an die Methode übergeben wird.
def foo(block = nil)
p block
end
foo # => nil
foo("test") # => test
foo { puts "this block will not be called" } # => nil
def foo(&block)
p block
end
foo # => nil
foo("test") # => ArgumentError: wrong number of arguments (1 for 0)
foo { puts "This block won't get called, but you'll se it referenced as a proc." }
# => #<Proc:[email protected]:20>
Sie können auch &block
verwenden, wenn Methoden Aufruf einer proc als Block auf eine Methode zu übergeben, so dass Sie Procs verwenden können, wie Sie Blöcke verwenden.
my_proc = proc {|i| i.upcase }
p ["foo", "bar", "baz"].map(&my_proc)
# => ["FOO", "BAR", "BAZ"]
p ["foo", "bar", "baz"].map(my_proc)
# => ArgumentError: wrong number of arguments (1 for 0)
Der Variablenname block
bedeutet nichts besonderes. Sie können &strawberries
verwenden, wenn Sie möchten, ist das kaufmännische Und hier der Schlüssel.
Sie könnten this article hilfreich finden.
+1 für '' '& erdbeeren''' – raycchan
Ich füge hinzu: es ist ähnlich wie Sie den Splat (dh '*') Operator für Arrays verwenden:' def foo (* args) ; other_foo (* Argumente); Ende nimmt ein beliebiges Array von Argumenten auf und übergibt dann dasselbe Array an den inneren Funktionsaufruf. Mit Blöcken würde man 'def foo (& block); other_foo (& Block); Ende –
In einer Argumentliste übernimmt &whatever
den Block, der an die Methode übergeben wurde, und umschließt ihn in einem Proc-Objekt. Der Proc wird in einer Variablen namens whatever
gespeichert (wobei das der Name sein kann, den Sie nach dem kaufmännischen Und-Zeichen eingegeben haben, natürlich - normalerweise ist es "Block"). Nach einem Methodenaufruf verwandelt die &whatever
Syntax einen Proc in einen Block. Also, wenn Sie eine Methode, wie so definieren:
def thing(&block)
thing2 &block
end
Sie eine Methode definieren, die einen Block nimmt und ruft dann eine andere Methode mit diesem Block.
Wenn Sie & vor dem Block nicht festlegen, erkennt Ruby seine Beziehung zu dem "Block", den Sie an die Funktion übergeben, nicht. Hier einige Beispiele.
def f(x, block); end
f(3) { 2+2 } # gives an error, because "block" is a
# regular second argument (which is missing)
def g(x, &block); end
g(3) { 2+2 } # legal
def h(x); end
h(3) { 2+2 } # legal
für die spätere Verwendung in einer Funktion:
def x(&block) # x is a 0 param function
y(block) # y is a 1 param function (taking one "Proc")
z(&block) # z is a 0 param function (like x) with the block x received
end
Also, wenn Sie z(&block)
nennen es ist (fast !!) die gleiche wie z { yield }
Aufruf: Sie haben soeben den Block in die nächste Funktion übergeben.
- 1. Mysterious Ruby-Block-Verhalten: & Block gegen {block.call}
- 2. Ruby: Ausbeute Block von einem Block?
- 3. Unterschied zwischen statischem Block und statischem Zuordnen in Klasse?
- 4. Unterschied zwischen Resume und Goto in Fehlerbehandlung Block
- 5. Private/geschützte Block in Ruby?
- 6. Was ist der Unterschied zwischen Block und Inline-Block mit der Breite: 100%?
- 7. Unterschied zwischen inline wenn bedingte und Block, wenn bedingt in Ruby
- 8. Was ist der Unterschied zwischen statischem Block und statischem Feld?
- 9. Text zwischen Bindestrich Block
- 10. Kopiere Block zwischen Objekten
- 11. Ruby: Klasse akzeptiert einen Block?
- 12. Block Syntax Unterschied verursacht "LocalJumpError: kein Block gegeben (Ausbeute)"
- 13. Create Hash mit Block (Ruby)
- 14. Unterschied zwischen .. und ... in Ruby
- 15. Pygame Kollision zwischen Spieler und Block
- 16. Beziehung zwischen Keras, Lasagne, Block und Theano?
- 17. Einzel-Block-AES-Entschlüsselung in Ruby
- 18. Access Chef Ressourcen in Ruby Block
- 19. Ruby Debugger Schritt in einen Block direkt?
- 20. Wie benötigt man einen Block in Ruby?
- 21. Nicht identifizierter Tidentifier im Ruby-Block
- 22. Individuelle Block in magento
- 23. Wenn Block vs Switch-Case-Block
- 24. Syntax definieren einen Block, einen Block und gibt einen Block in Objective-C
- 25. Ruby-Block Zeichenfolge anstelle der Ausführung
- 26. Ruby überprüfen, ob Block 0 ist
- 27. Ruby Doppelrohr Zuweisung mit Block/proc/Lambda?
- 28. dispatch_async und block in iOS
- 29. Variable Zuordnung erfolgt in einem Block in einem Block
- 30. Synchronisierte Block- und Monitorobjekte
Sehr gute Frage @collimarco –