문제

이 기사 는 procs를 호출하는 4 가지 방법을 언급합니다Ruby 1.9에서===는 그 중 하나입니다.왜 이것이 이런 식으로 이런 식으로 이루어질 수 있는지 이해하지 못합니다.===의 정상적인 의미와 관계가 있습니까? (두 오브젝트가 동일한 객체인지 묻는 것)

irb(main):010:0> f =-> n {[:hello, n]}
=> #
irb(main):011:0> f.call(:hello)
=> [:hello, :hello]
irb(main):012:0> f === :hello
=> [:hello, :hello]
irb(main):013:0> Object.new === Object.new
=> false
irb(main):014:0> f === f
=> [:hello, #]
.

도움이 되었습니까?

해결책

이 문서가 문서가 말하는 것 :

PROC 객체가 when 절의 대상이 될 수있게하는 것입니다. Case 문.

이것은 아마도 고지 된 것입니다. 예 :

even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
  puts "even!"
else
  puts "odd!"
end
.

case/when가 기본적으로 다음과 같이 실행되기 때문에 작동합니다.

if even === n
  puts "even!"
else
  puts "odd!"
end
.

case/when는 인수에서 === 클로스에 대한 when를 호출하여 진리 값을 반환하는 첫 번째를 선택하여 어떤 분기를 실행하여 실행할 지점을 확인합니다.

평등 연산자 (GENERACODODICTAGODE)와의 유사성에도 불구하고 강하고 약한 형태가 아닙니다. 나는 PergeraCodiceTag 코드 연산자를 "속한"연산자로 생각하려고 노력합니다. == 이 클래스 (즉, 클래스의 클래스 또는 하위 클래스의 인스턴스)에 속한 에 속한지 확인할 수 있도록 정의 할 수 있습니다. ===는 인수 인지 확인을 정의합니다. 범위 (즉, 범위에 포함됨)에 속합니다. 이것은 실제로 Class 사례가 더 의미가 있지만 위의 예와 같이 자신의 연산자에 속하는 도구로 생각합니다. 에 속한 에 속한

을 결정할 수있는 객체를 정의했습니다.

다른 팁

루비의 ===는 JavaScript와 달리 평등에 관한 것이 아닙니다.특별히 사용됩니다 사례 표현식을위한 :

case cats.length
  when 42                         # Uses 42      === cats.length
    puts :uh
  when /cool/i                    # Uses /cool/i === cats.length
    puts :oh
  when ->(n){ n.odd? || n/3==6 }  # Passes cats.length to the proc
    puts :my
end
.

이 기능은 비교에서 무언가를 계산 해야하는 경우에 유용합니다.

is_odd  =-> n { n%2 != 0 }
is_even =-> n { n%2 == 0 }

case 5
when is_even
  puts "the number is even"
when is_odd
  puts "the number is odd"
end

=> the number is odd
.

===의 정상적인 의미와 관계가 있습니까? (두 오브젝트가 동일한 객체인지 묻는 것)

실제로 루비의 ===에 대한 일반적인 오해입니다.실제로 Object#object_id 비교를 위해 엄격하지는 않습니다 (많은 일반적인 호출에서는 그 동작이지만).Ruby에서 ===는 케이스 .

===에서 Object의 설명은 다음과 같습니다. "Case Equality - 클래스 객체의 경우 효과적으로 동일합니다. #== 호출로서, 그러나 일반적으로 자손에 의해 무시됨 사례 진술에서 의미있는 의미론을 제공합니다. "

슬프게도, 그것이 세 개의 =로 구성 되더라도 평등으로 할 수있는 것도 원격으로 아무 것도 없을 것입니다 .-D

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top