development

=== vs. == 루비

big-blog 2020. 11. 7. 10:46
반응형

=== vs. == 루비


Ruby에서 ==와 ===의 차이점은 무엇입니까? RDoc는 말한다

Case Equality—Object 클래스의 경우 # ==을 호출하는 것과 사실상 동일하지만 일반적으로 case 문에서 의미있는 의미를 제공하기 위해 하위 항목에 의해 재정의됩니다.

#==은 동일 ==? case 문에서 이것이 언제 / 어떻게 사용되는지에 대한 예를 제공 할 수 있습니까?


두 사람은 정말 서로 관련이 없습니다. 특히 #==는 같음 연산자이며 같음과 #===는 전혀 관련이 없습니다. 개인적으로, 나는 그것이 오히려 불행한 것을 발견 #===유사한 너무 외모 #==의 등호 사용하고 자주 호출 하는 경우 평등 연산자 , 삼중 등호 연산자 또는 threequals 연산자를 정말 평등과 아무 상관이없는 경우.

나는 case subsumption operator를 부릅니다 #===. (내가 생각 해낼 수있는 최선의 방법이며, 특히 원어민의 제안에 개방적입니다.)

설명하는 가장 좋은 방법 a === b은 "라벨이 붙은 서랍이 있다면 그 a안에 넣는 것이 합리적 b입니까?"입니다.

따라서, 예를 들어, Module#===여부를 테스트합니다 b.is_a?(a). 만약 그렇다면 Integer === 2, 2라벨이 붙은 상자 에 넣는 것이 합리적 Integer입니까? 네, 그렇습니다. 어때 Integer === 'hello'? 당연히 아니.

또 다른 예는 Regexp#===. 일치하는지 테스트합니다. 'hello'라벨이 붙은 상자 에 넣는 것이 합리적 /el+/입니까? 네, 그렇습니다.

범위와 같은 컬렉션의 Range#===경우 멤버십 테스트로 정의됩니다. 해당 요소가 컬렉션에있는 경우 컬렉션으로 레이블이 지정된 상자에 요소를 넣는 것이 좋습니다.

그래서 #===그것이 하는 일입니다 : 인수가 수신자 아래에 포함될 수 있는지 여부를 테스트합니다.

그게 case표현 과 무슨 관련이 있습니까? 단순한:

case foo
when bar
  baz
end

와 같다

if bar === foo
  baz
end

예, #==문서는 " ==현재 개체 의 인스턴스 메서드"를 의미 합니다.

=== 다음과 같은 case 문에서 사용됩니다.

case obj
when x
  foo
when y
  bar
end

와 같다

if x === obj
  foo
elsif y === obj
  bar
end

자신을 정의하는 일부 클래스 ===는 Range (처럼 작동 include?), Class (처럼 작동 obj.is_a?(klass)) 및 Regexp( =~부울 반환을 제외하고 작동 )입니다. 자신을 정의하지 않는 일부 클래스 ===는 숫자 클래스와 문자열입니다.

그래서

case x
when 0
  puts "Lots"
when Numeric
  puts(100.0 / x)
when /^\d+$/
  puts(100.0 / x.to_f)
default
  raise ArgumentError, "x is not a number or numeric string"
end

와 같다

if 0 == x
  puts "Lots"
elsif x.is_a? Numeric
  puts(100.0 / x)
elsif x =~ /^\d+$/
  puts(100.0 / x.to_f)
else
  raise ArgumentError, "x is not a number or numeric string"
end

재미있는 사실 ===은 예외를 일치시키는데도 사용됩니다.rescue

다음은 예입니다.

class Example
  def self.===(exception)
    puts "Triple equals has been called."
    true
  end
end

raise rescue Example
# => prints "Triple equals has been called."
# => no exception raised

시스템 오류를 일치시키는 데 사용됩니다.

SystemCallError.===둘이 동일한 errno를 가질 때 true를 리턴하도록 정의되었습니다. 과 같은 동일한 오류 번호를이 시스템 호출 오류로 Errno::EAGAIN하고 Errno::EWOULDBLOCK, 두 단지 그들 중 하나를 나열하여 구조 할 수 있습니다.

참고URL : https://stackoverflow.com/questions/3422223/vs-in-ruby

반응형