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

Rubys 사례 설명 - 고급 기술

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