개발관련/other

equal, eql, ===, ==의 차이점

Rateye 2021. 7. 23. 10:15
728x90
반응형

 

질문 : 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 수준에서 == objother 가 동일한 객체 인 경우에만 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? objother 가 동일한 해시 키를 참조하는 경우 메서드는 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
728x90
반응형