2011-10-12 4 views
4

Array가 트리플 등호 메서드 ===을 오버라이드하지 않는 것으로 나타났습니다.이 메서드는 대소 문자 균등 메서드라고도합니다.왜 Array가 Ruby에서 트리플 등호 (triple equal sign) 메서드를 무시합니까?

x = 2 

case x 
    when [1, 2, 3] then "match" 
    else "no match" 
end # => "no match" 

범위 연산자가하는 반면 :

x = 2 

case x 
    when 1..3 then "match" 
    else "no match" 
end # => "match" 

당신은 그러나, 배열에 대한 해결 방법을 수행 할 수 있습니다

x = 2 

case x 
    when *[1, 2, 3] then "match" 
    else "no match" 
end # => "match" 

그것은이 경우 이유를 알고 있습니까?

x이 범위보다 실제 배열이되고 ===을 덮어 쓰는 배열이 평등이 일치하지 않는다는 뜻인가요?

# This is ok, because x being 1..3 is a very unlikely event 
# But if this behavior occurred with arrays, chaos would ensue? 
x = 1..3 

case x 
    when 1..3 then "match" 
    else "no match" 
end # => "no match" 
+0

당신의 직관 내 일치합니다. Range를 다른 범위와 일치시키기 위해 'case'표현식에 전달하려는 많은 시나리오를 생각할 수는 없지만, Array를 전달하여 배열을 전달할 것인지 여러 가지를 생각할 수 있습니다. 정확히 다른 배열과 일치했습니다. –

+0

확실한 답을 얻으려면 core에 질문해야 할 것입니다. 내 생각 엔 배열은 * 범위가 있기 때문에 * 동작하지 않는다는 것입니다. – sheldonh

답변

2

왜냐하면 in the specification입니다.

it "treats a literal array as its own when argument, rather than a list of arguments" 

사양 Charles Nutter (@headius)에 의해 was added 2009년 2월 3일. 이 답변은 아마도 당신이 찾고있는 것이 아니기 때문에 그에게 묻지 않으시겠습니까?

어둠 속에서 완전히 알려지지 않은 찌르는듯한 찌르레기를 잡으려면 질문에 a splat을 사용하여 답을 칠 수도 있습니다. 이 기능은 설계 상 사용할 수 있으므로 왜 복제하면 배열 평등을 테스트 할 수있는 능력이 없어지겠습니까? Jordan이 위에서 지적했듯이, 이것이 유용한 곳에 상황이 존재합니다.


미래의 독자들은 문제의 배열이 이미 인스턴스화되지 않는 한, 전혀 배열을 사용하여 여러 표현에 일치 할 필요는 없습니다 있음을 유의하십시오 :

x = 2 

case x 
    when 1, 2, 3 then "match" 
    else "no match" 
end # => "match" 
관련 문제