2016-04-03 2 views
2

Когда я называю отдельные методы ниже классов, я ожидал ArgumentError, но я вижу:Ожидаемое ArgumentError но получил NoMethodError

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

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

Но это действует, как ожидалось:

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) 

Может кто-нибудь объяснить, почему (&block) рассматривается как специальный? В моем понимании, если я не предоставил значение по умолчанию аргументу, то ожидается ArgumentError.

+1

спасибо за редактирование @sawa, теперь он выглядит более чистым :) – illusionist

ответ

2

Ничего сложного. Дело в том, что блок не является аргументом. С A, если вы передадите блок, который будет называться block как преобразованный proc, в противном случае block имеет значение nil. Но в любом случае block является результатом преобразования переданного блока (который не является ни аргументом, ни объектом) в proc (который является объектом).

+0

, но имя 'block' дано мной, я могу поместить любое имя, которое мне нравится, и использовать его таким образом. Почему это не аргумент? можете ли вы предоставить ссылки на ссылки @Sawa – illusionist

Смежные вопросы