Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

평등을 구현하여 Ruby에서 두 객체를 비교하는 방법

평등은 두 가지가 같은 것을 의미합니다. Ruby에서는 객체와 값을 비교하여 동일한 객체인지 확인합니다.

질문은...

Ruby에서 두 가지를 어떻게 비교합니까?

좋아요 :

1 == 1

# true

이미 알고 계실 것입니다...

하지만 == 구문이 아니라 메서드입니까?

영향이 큽니다.

자신의 클래스에서 이 메서드를 구현하여 클래스를 더욱 강력하게 만들 수 있습니다. 이 게시물에서 배우게 될 내용입니다!

두 개체를 동일하게 만드는 것은 무엇입니까?

다음과 같이 두 문자열을 비교할 수 있습니다.

"foo" == "foo"

단어 및 문자 동일하면 동일합니다.

표현식은 true를 반환합니다. .

String 클래스는 ==를 구현합니다. (등호 두 개) 문자열을 비교하는 방법을 알고 있는 메서드입니다.

하지만 String ==를 구현하지 않았습니다. ?

그런 다음 Ruby는 Object를 사용합니다. 의 == 구현 , 기본적으로 개체 콘텐츠 대신 개체 ID를 테스트합니다.

:

Object.new == Object.new # false
String.new == String.new # true

이유 Object false 반환 두 개의 새 개체가 개체 ID가 다르기 때문입니다.

String의 경우 , 내용을 기반으로 비교하고 두 개의 새 문자열이 동일한 내용(비어 있음)을 가지므로 true를 반환합니다. .

평등 구현

이제 방금 배운 내용을 사용하여 자신의 클래스를 비교할 수 있어 더욱 강력하게 만들어 보겠습니다.

== 덕분에 방법...

클래스의 두 인스턴스가 동일하다는 것이 정확히 무엇을 의미하는지 정의할 수 있습니다.

:

class Product
  attr_reader :name, :price

  def initialize(name, price)
    @name, @price = name, price
  end

  def ==(other)
    self.name  == other.name &&
    self.price == other.price
  end
end

p1 = Product.new('book', 49)
p2 = Product.new('book', 49)

p1 == p2 # true

== 메소드는 두 개의 Product에 대해 이름과 가격이 모두 같아야 한다고 말합니다. 동등한 것으로 간주되는 개체.

기억 :

이 방법을 구현하지 않거나 Comparable 내 Ruby 책에서 설명하는 모듈) 두 개체는 값 대신 개체 ID를 사용하여 비교됩니다.

또한 Struct를 사용하는 경우 이미 ==를 구현하고 있음을 언급해야 합니다. 당신을 위해.

삼중 등호는 어떻습니까?

== 메서드는 ===입니다. 방법도? 그리고 대답은 예입니다 🙂

그렇다면 둘의 차이점은 무엇입니까?

Javascript에는 ==라는 분명한 차이가 있습니다. 개체 유형이 동일하지 않은 경우(1'1' ). 그리고 === '엄격한' 평등을 위한 것입니다.

그러나 Ruby에는 그런 것이 없습니다. === 무엇 수단은 그것을 구현하는 클래스에 따라 다릅니다.

대부분의 경우 ==의 별칭일 뿐입니다. .

String과 같이 및 Object .

다음은 ===를 제공하는 내장 클래스 표입니다. 특별한 의미:

클래스 의미
범위 obj가 범위의 요소이면 true를 반환하고 그렇지 않으면 false를 반환합니다.
정규 표현식 문자열에 대해 정규 표현식을 찾습니다.
모듈 obj가 mod의 인스턴스이거나 mod의 자손 중 하나의 인스턴스인 경우 true를 반환합니다.
프로세스 Proc#call과 같은 proc의 매개변수로 obj를 사용하여 블록을 호출합니다. . proc 개체가 when의 대상이 되도록 하는 것입니다. case 문의 절.

결론

이 게시물에서는 ==를 구현하여 클래스를 더욱 강력하게 만드는 방법을 배웠습니다. 방법. ==의 차이점도 배웠습니다. 및 === .

이 게시물을 공유하는 것을 잊지 마세요. 더 많은 분들이 보실 수 있도록 🙂