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 === x
x === 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
나는 오늘 대답을 찾는 동안이 문제에 부딪 쳤으며 이것이 처음으로 나타나는 페이지이므로 동일한 상황에서 다른 사람들에게 유용 할 것이라고 생각했습니다.
답변
case
Ruby에서 사용 합니다. 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 예제를 사용하여 수행 할 수 있으며 이러한 유형의 경우에는이 방법 만 더 명확합니다.