2010-07-23 6 views
7

레일 코드에서루비 클래스의 <= 연산자는 무엇입니까? 조각 다음

def rescue_from(*klasses, &block) 
    options = klasses.extract_options! 

    unless options.has_key?(:with) 
     if block_given? 
     options[:with] = block 
     else 
     raise ArgumentError, "Need a handler. Supply an options hash that has a :with key as the last argument." 
     end 
    end 

    klasses.each do |klass| 
     key = if klass.is_a?(Class) && klass <= Exception 
     klass.name 
     elsif klass.is_a?(String) 
     klass 
     else 
     raise ArgumentError, "#{klass} is neither an Exception nor a String" 
     end 

     # put the new handler at the end because the list is read in reverse 
     self.rescue_handlers += [[key, options[:with]]] 
    end 
    end 
end 

공지 사항 운영자 < =

그 무엇입니까?

답변

9

는 모듈 (따라서 클래스)에 의해 노출 된 모든 비교 연산자에 문서에 대한 http://ruby-doc.org/core/classes/Module.html#M001669를 참조하십시오.

"mod가 다른 클래스의 하위 클래스이거나 다른 클래스와 동일한 경우 true를 반환합니다. 둘 사이에 관계가 없으면 nil을 반환합니다 (클래스 정의에 대한 관계를 생각해보십시오. : "클래스 A < B"는 "A < B"를 의미 함). "

1

분명히 klass가 예외 유형이라는 것을 분명히하십시오.

일반적으로 '작거나 같음'을 의미하지만 그래서 그 코드는 적어도 클래스이지만 예외는 아니라는 것을 말하고있을 수 있습니다. 그러나 그때 '미만'의 아키텍처는 제자리에 없을 것입니다.

# 핸들러는 상속 코드 문서에서

. 오른쪽에서 왼쪽으로
# 아래에서 위로 계층 구조를 검색합니다.
# exception.is_a? (klass)가 true 인 첫 번째 클래스의 핸들러는 호출 된 경우에 호출됩니다.

3

"LHS는 RHS와 동일한 클래스 또는 서브 클래스입니다"에 대한 연산자입니다. <은 "LHS는 RHS의 하위 클래스입니다."연산자입니다.

이 사업자의 이상한 과부하이지만, 또한 그래서 적어도 그 의미에서 일관된

class SomeClass < ActiveRecord::Base 

에로, <을 사용하여 루비의 서브 클래스 선언을 확인합니다.

(LHS : 왼쪽, RHS : 오른쪽)

+0

"왜곡 된 연산자 오버로딩"이라고 생각하는 이유는 무엇입니까? 상속 관계 (Inheritance Relationship)는 클래스들에 대한 부분적인 순서를 부과하며, 일반적으로 부분적 순서를 부여하는 관계를 표현하기 위해 사용 된 심볼은'<='(오히려'≤'이지만 Ruby에서 유효한 메소드 이름이지만 유효하지 않습니다 연산자 이름). 서브 타입 관계를 나타 내기위한 일반적인 연산자가'<:'이지만 Ruby에서는 유효한 메소드 나 연산자 이름이 아니므로 개인적으로'<='가 충분히 좋다고 느낍니다. 집합 유니온 ('∪'이어야 함)에'+'를 사용하는 일반적인 남용을 능가합니다. –

4

그것은 수신기 클래스는 인수의 서브 경우 true를 반환 is_a? 방법의 비교; 고려 :

Fixnum.superclass # => Integer 
Fixnum <= Integer # => true 
관련 문제