[ruby] Ruby에서 switch 문을 작성하는 방법

switch루비 로 문장을 작성하려면 어떻게해야 합니까?



답변

루비는 대신 case표현식을 사용합니다.

case x
when 1..5
  "It's between 1 and 5"
when 6
  "It's 6"
when "foo", "bar"
  "It's either foo or bar"
when String
  "You passed a string"
else
  "You gave me #{x} -- I have no idea what to do with that."
end

루비는 절을 사용하여 절의 when객체와 절의 객체를 비교합니다 . 예를 들어, 및 아닙니다 .case===1..5 === xx === 1..5

이를 통해 when위에서 본 것처럼 정교한 절이 가능합니다 . 범위, 클래스 및 모든 종류의 것들을 평등이 아닌 테스트 할 수 있습니다.

달리 switch다른 많은 언어 문, 루비는 case없는 추락을 통해 각각의 종료 할 필요가 없습니다, when와 함께 break. when같은 단일 절 에 여러 개의 일치 항목을 지정할 수도 있습니다 when "foo", "bar".


답변

case...when클래스를 처리 할 때 예기치 않게 약간 작동합니다. 이것은 ===연산자를 사용하기 때문입니다 .

이 연산자는 리터럴에서 예상대로 작동하지만 클래스에서는 작동하지 않습니다.

1 === 1           # => true
Fixnum === Fixnum # => false

이것은 case ... when객체의 클래스를 오버 하고 싶을 때 작동하지 않는다는 것을 의미합니다 .

obj = 'hello'
case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string or number')
end

“문자열 또는 숫자가 아닙니다”를 인쇄합니다.

다행히도 이것은 쉽게 해결됩니다. ===가 반환하도록 연산자는 정의 된 true당신이 클래스를 사용하고 두 번째 피연산자로 해당 클래스의 인스턴스를 제공하는 경우 :

Fixnum === 1 # => true

즉, 위의 코드는 .class다음 을 제거하여 수정할 수 있습니다 .

obj = 'hello'
case obj  # was case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string or number')
end

나는 오늘 대답을 찾는 동안이 문제에 부딪 쳤으며 이것이 처음으로 나타나는 페이지이므로 동일한 상황에서 다른 사람들에게 유용 할 것이라고 생각했습니다.


답변

caseRuby에서 사용 합니다. Wikipedia의 ” 스위치 설명 ” 도 참조하십시오 .

인용 :

case n
when 0
  puts 'You typed zero'
when 1, 9
  puts 'n is a perfect square'
when 2
  puts 'n is a prime number'
  puts 'n is an even number'
when 3, 5, 7
  puts 'n is a prime number'
when 4, 6, 8
  puts 'n is an even number'
else
  puts 'Only single-digit numbers are allowed'
end

또 다른 예:

score = 70

result = case score
   when 0..40 then "Fail"
   when 41..60 then "Pass"
   when 61..70 then "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

내 Kindle 의 Ruby Programming Language (1st Edition, O’Reilly)의 123 페이지 부근 then에서 when절 다음의 키워드를 구문에서와 같이 줄 바꿈 또는 세미콜론으로 바꿀 수 있다고 말합니다 if then else. (Ruby 1.8은 대신에 콜론을 then허용하지만이 구문은 Ruby 1.9에서 더 이상 허용되지 않습니다.)


답변

사건 … 때

척의 답변 에 더 많은 예제를 추가하려면 :

매개 변수로 :

case a
when 1
  puts "Single value"
when 2, 3
  puts "One of comma-separated values"
when 4..6
  puts "One of 4, 5, 6"
when 7...9
  puts "One of 7, 8, but not 9"
else
  puts "Any other thing"
end

매개 변수없이 :

case
when b < 3
  puts "Little than 3"
when b == 3
  puts "Equal to 3"
when (1..10) === b
  puts "Something in closed range of [1..10]"
end

의 유의하십시오 ” 어떻게 루비에서 switch 문을 작성하는 kikito에 대해 경고 것을”.


답변

많은 프로그래밍 언어, 특히 C에서 파생 된 프로그래밍 언어는 소위 스위치 폴 스루를 지원합니다 . 루비에서 똑같이하는 가장 좋은 방법을 찾고 있었고 다른 사람들에게 유용 할 것이라고 생각했습니다.

C와 유사한 언어에서는 일반적으로 다음과 같이 나타납니다.

switch (expression) {
    case 'a':
    case 'b':
    case 'c':
        // Do something for a, b or c
        break;
    case 'd':
    case 'e':
        // Do something else for d or e
        break;
}

루비에서도 다음과 같은 방법으로 달성 할 수 있습니다.

case expression
when 'a', 'b', 'c'
  # Do something for a, b or c
when 'd', 'e'
  # Do something else for d or e
end

이것은 'a'코드 블록을 실행하기 전에 코드 블록을 실행할 수 없으므로 엄격하게 동일하지 않습니다.'b' 또는로'c' 하지는 않지만 대부분 동일한 방식으로 유용 할 정도로 유사하다는 것을 알았습니다.


답변

Ruby 2.0에서는 case다음과 같이 명령문에 람다를 사용할 수 있습니다 .

is_even = ->(x) { x % 2 == 0 }

case number
when 0 then puts 'zero'
when is_even then puts 'even'
else puts 'odd'
end

사용자 정의가있는 Struct를 사용하여 자체 비교기를 쉽게 만들 수도 있습니다. ===

Moddable = Struct.new(:n) do
  def ===(numeric)
    numeric % n == 0
  end
end

mod4 = Moddable.new(4)
mod3 = Moddable.new(3)

case number
when mod4 then puts 'multiple of 4'
when mod3 then puts 'multiple of 3'
end

( ” Ruby 2.0에서 procs를 case 문과 함께 사용할 수 있습니까?”

또는 완전한 수업으로 :

class Vehicle
  def ===(another_vehicle)
    self.number_of_wheels == another_vehicle.number_of_wheels
  end
end

four_wheeler = Vehicle.new 4
two_wheeler = Vehicle.new 2

case vehicle
when two_wheeler
  puts 'two wheeler'
when four_wheeler
  puts 'four wheeler'
end

( ” 루비 사례 설명의 작동 방식과 할 수있는 작업 “에서 발췌 한 예 )


답변

문자열 유형 찾기와 같은 정규식을 사용할 수 있습니다.

case foo
when /^(true|false)$/
   puts "Given string is boolean"
when /^[0-9]+$/
   puts "Given string is integer"
when /^[0-9\.]+$/
   puts "Given string is float"
else
   puts "Given string is probably string"
end

루비 는 이것을 위해 case평등 피연산자 ===를 사용합니다 (@JimDeville 덕분에). 추가 정보는 ” 루비 연산자 ” 에서 확인할 수 있습니다 . 이것은 매개 변수없이 @mmdemirbas 예제를 사용하여 수행 할 수 있으며 이러한 유형의 경우에는이 방법 만 더 명확합니다.