2017-03-15 2 views
1

double splat을 사용하여 해시 변수를 확장하려고 시도하는 이상한 동작이 발생했습니다. 왜 이런 일이 일어나고 있는지 모르겠다.Ruby에서 double splat을 사용하여 변수에서 빈 해시 확장하기

내 루비 버전 이런 일이 왜

class MyClass 
    def my_method; end 
end 

MyClass.new.my_method(*[]) # returns nil 

MyClass.new.my_method(**{}) # returns nil 

MyClass.new.my_method(*[], **{}) # returns nil 


# Using variables 

values = [] 
k_values = {} 

MyClass.new.my_method(*values) # returns nil 

MyClass.new.my_method(**k_values) # *** ArgumentError Exception: Wrong number of arguments. Expected 0, got 1. 

MyClass.new.my_method(*values, **k_values) # *** ArgumentError Exception: Wrong number of arguments. Expected 0, got 1. 


# In summary 

MyClass.new.my_method(**{}) # returns nil 

MyClass.new.my_method(**k_values) # *** ArgumentError Exception: Wrong number of arguments. Expected 0, got 1. 

가 하나라도 알고 있나요

ruby 2.2.6p396 (2016-11-15 revision 56800)

시나리오? 이거 버그 야?

+3

'my_method' 코드는? – MikDiet

+0

작전, 잊어 버렸습니다! 지금 업데이트 중 ... – rafaels88

답변

1

예, 그것은 매우 버그

def foo(*args) 
    args 
end 

foo(**{}) 
# => [] 

h = {} 

foo(**h) 
# => [{}] 

그것은 변수의 더블 플랫의 경우 첫 번째 인수로 빈 해시를 통과하는 것 같습니다.

내 버전은 ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

+0

내 질문이 업데이트되었습니다. 나는이 방법의 구현을 잊어 버렸다. 'foo'에서 매개 변수를받지 않고 다시 시도 할 수 있습니까? – rafaels88

+1

귀하의 방법에 매개 변수가 없다는 것을 알고 있습니다. 내 대답은 왜 당신이'ArgumentError Exception'을 받았는지를 보여 주었다. 왜냐하면 변수의 double splat은 빈 해시를 첫 번째 인수로 메서드에 전달하기 때문이다. @ rafaels88 – MikDiet

+0

네, 맞습니다 ... 지금 생각대로 생각하고 foo (** {a : 1})','h = {a : 1}; foo (** h)', 당신이 예제에서 전달한 것처럼 빈 해시를 전달하는 것과는 동작이 다릅니다. 그것은 버그처럼 보인다. 진단을 위해 대단히 감사합니다! – rafaels88

관련 문제