2016-04-03 15 views
2

Als ich unten einzelnen Methoden in den Klassen nennen, ich ArgumentError erwartete, aber ich sehe:Erwartet Argument bekam aber NoMethodError

class A 
    def with_one_argument(&block) 
    block.call 
    end 
end 

A.new.with_one_argument 
# => NoMethodError: undefined method `call' for nil:NilClass 

Aber das wirkt wie erwartet:

class B 
    def with_one_argument(some_value) 
    puts some_value 
    end 
end 

B.new.with_one_argument 
# => ArgumentError: wrong number of arguments (0 for 1) 

Kann jemand erklären, Warum wird (&block) als besonders behandelt? Meiner Meinung nach wird ArgumentError erwartet, wenn ich einem Argument keinen Standardwert bereitstelle.

+1

danke für die Bearbeitung @sawa, sieht es jetzt sauberer :) – illusionist

Antwort

2

Nichts kompliziert. Die Tatsache ist einfach, dass ein Block kein Argument ist. Wenn Sie mit A einen Block übergeben, wird dies als konvertierter Prozess mit block bezeichnet, andernfalls hat block den Wert nil. Aber in jedem Fall ist block das Ergebnis der Umwandlung des übergebenen Blocks (der weder ein Argument noch ein Objekt ist) in ein proc (das ein Objekt ist).

+0

aber der Name 'Block' ist von mir gegeben, ich kann jeden Namen, den ich mag, und verwenden Sie es so. Wie kommt es, dass es kein Argument ist? können Sie einige Referenzlinks @Sawa bereitstellen – illusionist

Verwandte Themen