2011-01-18 5 views
13

메소드 # to_proc의 버그입니까? (Ruby 1.8.7)

def foo(arg); p arg; end 

내가 하늘의 배열로 호출 할 수 있습니다 :

는 하나 개의 인수가 소요 다음과 같은 방법을 감안할 때

foo([]) 
# prints [] 

나는 또한 Method 객체로 저장하고 빈과 그을 호출 할 수 있습니다 같은 결과 배열 :

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

그러나, 나는 ProcMethod 개체를 변환하고 빈 배열가, 내가 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(*[])로 작성된 것처럼 행동하는 것 같습니다. 그러나, 나는 내가 기대하는 방식 행동 않습니다 의 -empty 배열, 그것으로 호출하는 경우 :이 인수를 destructures하지만 인수가 빈 상태 (empty)의 배열 될 일 경우에만 그래서

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

합니다. 그리고 내가 Method#to_proc를 부를 때만.

방법 Method 또는 Proc 작업에 대한 이해의 차이가 있는가, 또는이 버그?

루비 1.8.7-p299을 실행하고 있습니다. 나는 1.8.6-p399와 1.8.7-head에서 같은 행동을 관찰한다. 그러나, 나는 1.9.1-P378에 표시되지 않습니다 :이 세 가지 형태의 인쇄 []를 빈 배열로 호출 할 때.

+4

는 일반적으로 나는 회의적 P,하지만 난 특히 고려,이 문제에 대한 다른 설명을 볼 수 없습니다 : */

은 어쩌면 우리는 FIXME에 그 변경해야 그것은 1.9에서 예상대로 작동합니다. 누군가 현명한 사람이 우리를 계몽 할 수 있기를 바랍니다. –

+1

나는 언어 자체에서 항상 버그를 찾지는 않지만 Ruby를 사용하고있을 때는 버그를 발견하지 못합니다. –

답변

13

이 거의 확실 버그는 방법 # 호출 인수에 대응 -1 (인수 C 어레이 기대)를 가지고 있으며, PROC 번호 호출 인수에 대응 -2 (기대를 가지고 루비 배열의 인수).

문제에 더 빛을 흘릴 수 PROC 번호 호출의 정의 위 eval.c에 더 도움이 코멘트있다 :

/* CHECKME : 인수가 확인하는 의미 올바른가? 누군가가 언어 자체의 버그를 발견했습니다 생각하면

+4

Ruby 1.9에서 수정되었으므로 버그라고 생각합니다. :) – sethvargo

관련 문제