Как foo (& nil) ведет себя иначе, чем foo (& "not proc")? - PullRequest
7 голосов
/ 14 сентября 2011

Я узнал от Гекла, что

[1, 2, 3].each(&nil)

не вызывает никаких ошибок - он просто возвращает перечислитель.

TypeError: wrong argument type String (expected Proc)

Кроме того, &nil вызывает block_given?вернуть false

def block_given_tester
  if block_given?
    puts "Block given"
  else
    puts "Block not given"
  end
end

block_given_tester(&nil) # => Block not given

Это не потому, что NilClass реализует to_proc - я проверил RDoc.

Я могу понять , почему было бы неплохо иметь &nil, но я не уверен, как это сделано.Это только один из способов, которыми nil имеет специальное поведение, не разделяемое другими объектами?

1 Ответ

8 голосов
/ 14 сентября 2011

Ответ можно найти, посмотрев на исходный код Ruby.

Ruby 1.8:

Посмотрите на функцию block_pass в файле eval.c.Обратите внимание, что он обрабатывает nil специально из Proc объектов (макрос NIL_P).Если функции передается нулевое значение, она оценивает пустой блок (я думаю) и возвращает.Код сразу после этого проверяет, является ли объект объектом Proc (функция rb_obj_is_proc) и вызывает исключение «неправильный тип аргумента (ожидаемый Proc)», если это не так.

Ruby 1.9.2:

Посмотрите на метод caller_setup_args в файле vm_insnhelper.c.Он преобразует процесс с to_proc, только если он не равен нулю;в противном случае преобразование типов и проверка типов игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...