case 문보다 더 간단하고 지루할 수 있는 것은 없습니다. 그것은 C로부터의 홀드오버입니다. 당신은 많은 if를 대체하기 위해 그것을 사용합니다. 경우 폐쇄. 아니면?
사실, Ruby의 case 서술문은 당신이 상상하는 것보다 훨씬 더 풍부하고 복잡합니다. 한 가지 예를 살펴보겠습니다.
case "Hi there"
when String
puts "case statements match class"
end
# outputs: "case statements match class"
이 예에서는 case 문이 항목의 값과 일치할 뿐만 아니라 뿐만 아니라 클래스 . 이것은 내부적으로 Ruby가 ===
를 사용하기 때문에 가능합니다. 운영자, 일명. 3 등호 연산자.
===
둘러보기 연산자
x === y
를 작성할 때 Ruby에서 y는 "y가 x로 표시되는 그룹에 속합니까?"라고 묻고 있습니다. 이것은 매우 일반적인 진술입니다. 구체적인 내용은 함께 작업하는 그룹의 종류에 따라 다릅니다.
# Here, the Class.===(item) method is called, which returns true if item is an instance of the class
String === "hello" # true
String === 1 # false
문자열, 정규식 및 범위는 모두 자체 ===(item)
를 정의합니다. 예상대로 작동하는 메소드. 자신의 클래스에 삼중 등호 메서드를 추가할 수도 있습니다.
이제 우리는 이것을 알았으므로 대소문자를 사용하여 모든 종류의 트릭을 수행할 수 있습니다.
케이스 문의 범위 일치
range === n
이라는 사실 덕분에 case 문에서 범위를 사용할 수 있습니다. 단순히 range.include?(n)
의 값을 반환합니다. . 어떻게 그렇게 확신할 수 있습니까? 문서에 있습니다.
case 5
when (1..10)
puts "case statements match inclusion in a range"
end
# outputs "case statements match inclusion in a range"
정규식과 case 문 일치
/regexp/ === "string"
때문에 case 문에서 정규식을 사용하는 것도 가능합니다. 문자열이 정규식과 일치하는 경우에만 true를 반환합니다. Regexp
문서 이것을 설명하십시오.
case "FOOBAR"
when /BAR$/
puts "they can match regular expressions!"
end
# outputs "they can match regular expressions!"
프로세스 및 람다 일치
이것은 일종의 이상한 것입니다. Proc#===(item)
를 사용하는 경우 , Proc#call(item)
을 하는 것과 같습니다. . 다음은 관련 문서입니다. 이것이 의미하는 바는 case 문에서 람다와 프로시저를 동적 매처로 사용할 수 있다는 것입니다.
case 40
when -> (n) { n.to_s == "40" }
puts "lambdas!"
end
# outputs "lambdas"
자신만의 매처 클래스 작성
위에서 언급했듯이 클래스에 사용자 지정 사례 동작을 추가하는 것은 자신만의 ===
를 정의하는 것만큼 간단합니다. 방법. 이를 위한 한 가지 용도는 복잡한 조건부 논리를 여러 개의 작은 클래스로 끌어내는 것입니다. 아래 예에서 이것이 어떻게 작동하는지 스케치했습니다.
class Success
def self.===(item)
item.status >= 200 && item.status < 300
end
end
class Empty
def self.===(item)
item.response_size == 0
end
end
case http_response
when Empty
puts "response was empty"
when Success
puts "response was a success"
end