질문 : equal ?, eql ?, === 및 ==의 차이점은 무엇입니까?
이 네 가지 방법의 차이점을 이해하려고 노력하고 있습니다. 나는 기본적으로 ==
메서드가 equal?
두 피연산자가 정확히 동일한 객체를 참조하면 true를 반환합니다.
===
는 기본적으로 ==
를 호출 equal?
... 좋아,이 세 가지 방법이 모두 재정의되지 않으면 ===
, ==
그리고 equal?
정확히 똑같은 일을합니까?
eql?
이 온다? . 이것은 무엇을 하는가 (기본적으로)? 피연산자의 해시 / ID를 호출합니까?
루비에는 왜 이렇게 많은 등호 기호가 있습니까? 의미론이 달라야합니까?
답변
여기에서 Object 문서 를 많이 인용 할 것입니다. 왜냐하면 여기에 훌륭한 설명이 있다고 생각하기 때문입니다. 이 메서드와 String 과 같은 다른 클래스에서 재정의되는 이러한 메서드에 대한 설명서도 읽어 보시기 바랍니다.
참고 : 다른 개체에 대해 직접 시도하려면 다음과 같이 사용하십시오.
class Object
def all_equals(o)
ops = [:==, :===, :eql?, :equal?]
Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })]
end
end
"a".all_equals "a" # => {"=="=>true, "==="=>true, "eql?"=>true, "equal?"=>false}
Object 수준에서 ==
obj
와 other
가 동일한 객체 인 경우에만 true를 반환합니다. 일반적으로이 메서드는 클래스 별 의미를 제공하기 위해 하위 클래스에서 재정의됩니다.
이것은 가장 일반적인 비교이므로 (클래스 작성자로서) 두 개체가 "동일"인지 아닌지 결정하는 가장 기본적인 위치입니다.
#==
를 호출하는 것과 실질적으로 동일하지만 일반적으로 case 문에서 의미있는 의미를 제공하기 위해 자손에 의해 재정의됩니다.
이것은 매우 유용합니다. ===
구현이있는 것들의 예 :
- 범위
- 정규식
- Proc (Ruby 1.9)
따라서 다음과 같은 작업을 수행 할 수 있습니다.
case some_object
when /a regex/
# The regex matches
when 2..4
# some_object is in the range 2..4
when lambda {|x| some_crazy_custom_predicate }
# the lambda returned true
end
case
+ Regex
가 코드를 훨씬 더 깔끔하게 만드는 방법에 대한 깔끔한 예는 여기 내 대답을 참조하십시오. 물론 고유 한 ===
case
의미를 얻을 수 있습니다.
eql?
obj
및 other
가 동일한 해시 키를 참조하는 경우 메서드는 true를 반환합니다. Hash
에서 멤버의 동등성을 테스트하는 데 사용됩니다. Object 클래스의 Object
경우 eql?
==
와 동의어입니다. 하위 클래스는 일반적으로 eql?
재정의 된 ==
메서드에 있지만 예외가 있습니다. Numeric
==
간에 유형 변환을 수행하지만 eql?
, 그래서 :
1 == 1.0 #=> true
1.eql? 1.0 #=> false
따라서 자신의 용도로 이것을 재정의하거나 ==
를 재정의하고 alias :eql? :==
두 가지 방법이 같은 방식으로 작동합니다.
==
과 달리 equal?
메서드는 하위 클래스에 의해 재정의되어서는 안됩니다. 객체 ID를 결정하는 데 사용됩니다 (즉, a
b
와 동일한 객체 인 경우 a.equal?(b)
).
이것은 사실상 포인터 비교입니다.
출처 : https://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and
'개발관련 > other' 카테고리의 다른 글
RESTful 검색 / 필터링을 설계하는 방법 (0) | 2021.07.28 |
---|---|
[스위프트] 문자열 유형으로 enumerate을 enum하는 방법 (0) | 2021.07.27 |
HTTP 파일 업로드하는 방법 (0) | 2021.07.22 |
프로젝트에서 CocoaPods를 제거하는 방법 (0) | 2021.07.22 |
YAML과 JSON의 차이점에 대해서 (0) | 2021.07.21 |