루비 1.9에서===에서 procs를 호출 할 수있는 이유는 무엇입니까?
-
12-12-2019 - |
문제
이 기사 는 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에서 ===
는 케이스 .
슬프게도, 그것이 세 개의 =
로 구성 되더라도 평등으로 할 수있는 것도 원격으로 아무 것도 없을 것입니다 .-D