루비 클래스 유형 및 사례 설명


135

차이점은 무엇입니까

case item.class
when MyClass
  # do something here
when Array
  # do something different here
when String
  # do a third thing
end

case item.class
when MyClass.class
  # do something here
when Array.class
  # do something different here
when String.class
  # do a third thing
end

어떤 이유로,이 중 첫 번째 작업은 때때로 작동하고 두 번째 작업은 작동하지 않으며 다른 경우에는 두 번째 작업이 작동하지 않고 첫 번째 작업이 작동하지 않습니다. 왜? 어느 것이 "적절한"방법입니까?


1
문자열은 클래스입니다. 클래스의 클래스는 클래스입니다.
Volte

MyClass === obj용도 모듈 # === 여부를 확인하는 방법 obj의 인스턴스입니다 MyClass.
sergio

답변:


234

다음을 사용해야합니다.

case item
when MyClass
...

나는 같은 문제가 있었다 : "case when"에서 Errno :: ECONNRESET 클래스를 잡는 방법?


1
감사! 속이는 것은 유감이지만 (또는 일종의 속이는) 미안하지만 여러 번의 검색으로 이전 질문이 나타나지 않았습니다. case 문에서 ===를 사용하는 것은 일반적인 문제입니다. 이제 이것이 문제임을 알았습니다. 이것은 아마도 튜토리얼 및 기타에서 더 자주 지적되어야합니다 (그러나 많은 튜토리얼 작성자도 이것을 알지 못합니다).
Daisy Sophia Hollman

4
ActiveRecord를 사용하는 경우 언급되지 않은 경고. 클래스 비교에서 ActiveRecord === 메소드는 .is_a?를 사용합니다. 이는 클래스의 서브 클래스가 case 문에서 true로 평가됨을 의미합니다. github.com/rails/rails/blob/…
Jeremy Baker

61

네, 나 킬론은 맞습니다 when. 절 에서 주어진 객체에서 threequal === 연산자가 어떻게 작동하는지 알아야합니다 . 루비에서

case item
when MyClass
...
when Array
...
when String
...

정말

if MyClass === item
...
elsif Array === item
...
elsif String === item
...

해당 사례가 3 개의 동일한 메소드 ( MyClass.===(item)예 :)를 호출 하고 해당 메소드를 원하는대로 수행하도록 정의한 후 casew 를 precisionw와 함께 사용할 수 있습니다.


만약 내가 arr = []그때 그 눈치 if Array === arrtrue로 평가하지만 if arr === Array거짓으로 평가합니다. 누군가 설명해 주시겠습니까?
Daniel

4
===는 클래스 디자이너가 원하는대로 무엇이든 할 수 있도록 정의 할 수있는 메소드 일뿐입니다. 또한 a === b는 실제로 a. === b를 의미하므로 a와 b를 전환하면 다른 동작을 얻을 수 있습니다. ===이 교환 형이라는 보장은 없습니다. 실제로 Array === Array는 false이지만 Object === Object는 true이므로 Array는 ===의 의미를 재정의합니다.
Fred


5

Ruby에서 클래스 이름은 Class특정 클래스를 설명하는 유형의 객체를 나타내는 상수입니다 . 즉 MyClass, Ruby에서 말하는 MyClass.class것은 Java 에서 말하는 것과 같습니다 .

obj.classClass의 클래스를 설명하는 유형의 객체 입니다 obj. obj.classis MyClass인 경우 (대략 말하기)를 obj사용하여 작성되었습니다 MyClass.new. MyClassClass사용하여 생성 된 객체를 설명하는 유형의 객체입니다 MyClass.new.

MyClass.classMyClass객체 의 클래스입니다 (를 사용하여 생성 된 객체를 설명하는 유형의 객체 클래스 입니다 ). 즉, .ClassMyClass.newMyClass.class == Class


1

item변수 의 특성에 따라 다릅니다 . 객체의 인스턴스 인 경우

t = 5

그때

t.class == Fixnum

그러나 그 자체가 클래스라면

t = Array

그러면 Class객체 가됩니다.

t.class == Class

편집 : "case when"에서 Errno :: ECONNRESET 클래스를 잡는 방법을 참조하십시오 . 내 대답이 잘못 될 수 있기 때문에 Nakilon에 명시된 바와 같이.


루비에서 모든 것은 "객체의 인스턴스"입니다.
Eric Duminil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.