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

차이점은 무엇입니까

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

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



답변

다음을 사용해야합니다.

case item
when MyClass
...

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


답변

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

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

정말

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

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


답변

당신이 사용할 수있는:

case item.class.to_s
    when 'MyClass'

… 다음과 같은 왜곡이 불가능한 경우 :

case item
    when MyClass

그 이유는, 즉 case사용 ===하고, 상기 관계 ===연산자 설명은 교환 법칙이 성립하지 . 예를 들어, 5이다 Integer, 그러나이다 Integera는 5? 이것이 당신이 case/를 생각하는 방법 when입니다.


답변

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


답변

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

t = 5

그때

t.class == Fixnum

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

t = Array

그러면 Class객체 가됩니다.

t.class == Class

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


답변