Это ошибка в методе # to_proc? (Ruby 1.8.7)

Учитывая следующий метод, который принимает один аргумент:

def foo(arg); p arg; end

Я могу вызвать его с пустым массивом:

foo([])
# prints []

Я могу также сохраните его как объект Method и вызовите that с пустым массивом с тем же результатом:

method(:foo).call([])
# prints []

Однако, если я конвертирую объект Method в a Proc и вызов , что с пустым массивом, я получаю ArgumentError :

method(:foo).to_proc.call([])
# ArgumentError: wrong number of arguments (0 for 1)
#   from (irb):4:in `foo'
#   from (irb):4:in `to_proc'
#   from (irb):10:in `call'

Я ожидал, что он будет вести себя так же, как и в предыдущих двух случаях. Вместо этого кажется, что я написал foo (* []) ​​. Однако, если я вызываю его с помощью непустого массива, он ведет себя так, как я ожидал:

method(:foo).to_proc.call([1])
# prints [1]

Таким образом, он разрушает аргумент, но только если аргумент является пустым массивом. И только если я вызову Method # to_proc .

Есть ли пробел в моем понимании того, как работают Method или Proc , или это ошибка?

Я использую Ruby 1.8.7-p299. Такое же поведение наблюдаю у 1.8.6-p399 и 1.8.7-head. Однако я не вижу этого в 1.9.1-p378: там все три формы печатают [] при вызове с пустым массивом.

13
задан Andrew Grimm 5 October 2011 в 22:31
поделиться