Ruby에서 switch
문은 어떻게 작성합니까?
질문자 :readonly
Ruby는 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
Ruby는 ===
연산자를 사용하여 when
절의 객체를 case
예를 들어, 1..5 === x
아니라 x === 1..5
입니다.
이것은 위에서 볼 수 있는 정교한 when
범위, 클래스 및 모든 종류의 항목은 평등이 아니라 테스트할 수 있습니다.
다른 많은 언어의 switch
문과 달리 case
에는 fall-through when
을 break
로 끝낼 필요가 없습니다. when "foo", "bar"
와 같이 when
절에 여러 일치 항목을 지정할 수도 있습니다.
Chuck
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
오늘 답을 찾다가 이 문제에 부딪혔는데, 이게 처음 나오는 페이지였기에 나와 같은 상황에 있는 다른 사람들에게 도움이 될 거라 생각했다.
kikito
Ruby에서 case
를 사용하여 수행됩니다. Wikipedia의 " Switch 문 "도 참조하십시오.
인용:
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페이지쯤 when
절 다음에 오는 then
키워드가 개행 또는 세미콜론으로 대체될 수 있다고 나와 있습니다( if then else
구문과 마찬가지로). then
대신에 콜론도 허용하지만 이 구문은 Ruby 1.9에서 더 이상 허용되지 않습니다.)
nonopolarity
케이스...때
Chuck의 답변 에 더 많은 예를 추가하려면 :
매개변수 포함:
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
kikito가 경고하는 " Ruby에서 switch 문을 작성하는 방법"에 유의하십시오.
mmdemirbas
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에서 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
(" Ruby Case Statement Works And What You Can Do With It "에서 가져온 예)
James Lim
많은 프로그래밍 언어, 특히 C에서 파생된 언어는 소위 Switch Fallthrough 를 지원합니다. Ruby에서 동일한 작업을 수행하는 가장 좋은 방법을 찾고 있었고 다른 사람들에게 유용할 수 있다고 생각했습니다.
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; }
Ruby에서는 다음과 같은 방법으로 동일한 작업을 수행할 수 있습니다.
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'
,하지만 대부분의 경우 나는 그것을 같은 방식으로 유용 유사한 충분히 찾을 수 있습니다.
Robert Kajic
문자열 유형 찾기와 같은 정규식을 사용할 수 있습니다.
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
Ruby의 case
에는 동등 피연산자 ===
를 사용합니다(@JimDeville에게 감사드립니다). 추가 정보는 " Ruby Operators "에서 확인할 수 있습니다. 이것은 @mmdemirbas 예제(매개변수 없이)를 사용하여 수행할 수도 있습니다. 이러한 유형의 경우에는 이 접근 방식만이 더 깔끔합니다.
Haris Krajina
case
라고 하며 예상한 대로 작동하며 테스트를 구현하는 ===
덕분에 훨씬 더 재미있는 것들이 있습니다.
case 5 when 5 puts 'yes' else puts 'else' end
이제 재미를 위해:
case 5 # every selector below would fire (if first) when 3..7 # OK, this is nice when 3,4,5,6 # also nice when Fixnum # or when Integer # or when Numeric # or when Comparable # (?!) or when Object # (duhh) or when Kernel # (?!) or when BasicObject # (enough already) ... end
case
매개변수를 생략하고 첫 번째 일치가 원하는 표현식을 작성하여 임의의 if/else 체인(즉, 테스트에 공통 변수가 포함되지 않은 경우에도)을 case
원하다.
case when x.nil? ... when (x.match /'^fn'/) ... when (x.include? 'substring') ... when x.gsub('o', 'z') == 'fnzrq' ... when Time.now.tuesday? ... end
DigitalRoss
Ruby 스위치 케이스에서 OR 조건을 사용하는 방법을 알고 싶다면:
그래서, A의 case
문, a는 ,
것과 같습니다 ||
if
문에서.
case car when 'Maruti', 'Hyundai' # Code here end
" Ruby Case Statement 작동 방식 및 수행할 수 있는 작업 " 을 참조하십시오 .
Manish Shrivastava
Ruby는 switch 문을 작성하기 위해 case
case
문서에 따라:
케이스 명령문의 인수의 위치에 임의의 조건으로 구성
case
, 0 개 이상의 절.when
조건과 일치하는(또는 조건이 null인 경우 부울 진리로 평가하는) 첫 번째when
case 문의 값은 성공한when
절의 값이거나 그러한 절이 없으면nil
case 문은
else
절로 끝날 수 있습니다. 각각의when
문은 쉼표로 구분된 여러 후보 값을 가질 수 있습니다.
예시:
case x when 1,2,3 puts "1, 2, or 3" when 10 puts "10" else puts "Some other number" end
더 짧은 버전:
case x when 1,2,3 then puts "1, 2, or 3" when 10 then puts "10" else puts "Some other number" end
그리고 " Ruby's case statement - 고급 기술 "은 Ruby case
설명합니다.
범위 와 함께 사용할 수 있습니다.
case 5 when (1..10) puts "case statements match inclusion in a range" end ## => "case statements match inclusion in a range"
정규식 과 함께 사용할 수 있습니다.
case "FOOBAR" when /BAR$/ puts "they can match regular expressions!" end ## => "they can match regular expressions!"
Procs 및 Lambda와 함께 사용할 수 있습니다.
case 40 when -> (n) { n.to_s == "40" } puts "lambdas!" end ## => "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
Lahiru
귀하의 경우에 따라 메소드의 해시를 사용하는 것을 선호할 수 있습니다.
when
대한 긴 목록이 있고 각각에 비교할 구체적인 값이 있는 경우(간격이 아님) 메서드의 해시를 선언한 다음 이와 같이 해시에서 해당 메서드를 호출하는 것이 더 효과적입니다.
# Define the hash menu = {a: :menu1, b: :menu2, c: :menu2, d: :menu3} # Define the methods def menu1 puts 'menu 1' end def menu2 puts 'menu 2' end def menu3 puts 'menu3' end # Let's say we case by selected_menu = :a selected_menu = :a # Then just call the relevant method from the hash send(menu[selected_menu])
Alexander
switch case
항상 단일 객체를 반환하므로 결과를 직접 인쇄할 수 있습니다.
puts case a when 0 "It's zero" when 1 "It's one" end
Sonu Oommen
값이 여러 개인 경우 및 값이 없는 경우:
print "Enter your grade: " grade = gets.chomp case grade when "A", "B" puts 'You pretty smart!' when "C", "D" puts 'You pretty dumb!!' else puts "You can't even use a computer!" end
그리고 정규 표현식 솔루션은 다음과 같습니다.
print "Enter a string: " some_string = gets.chomp case when some_string.match(/\d/) puts 'String has numbers' when some_string.match(/[a-zA-Z]/) puts 'String has letters' else puts 'String has no numbers or letters' end
123
Ruby에서는 두 가지 방법으로 case
표현식을 작성할 수 있습니다.
- 일련의
if
문과 유사 -
case
옆에 대상을 지정하고 각when
절을 대상과 비교합니다.
age = 20 case when age >= 21 puts "display something" when 1 == 0 puts "omg" else puts "default condition" end
또는:
case params[:unknown] when /Something/ then 'Nothing' when /Something else/ then 'I dont know' end
Vaisakh VM
이렇게 하면 더 자연스럽게
case expression when condtion1 function when condition2 function else function end
Navin
훌륭한 답변이 많이 있지만 사실 하나를 추가할 것이라고 생각했습니다.. 개체(클래스)를 비교하려는 경우 우주선 방법(농담 아님)이 있는지 확인하거나 비교 방법을 이해해야 합니다.
" Ruby Equality And Object Comparison "은 주제에 대한 좋은 토론입니다.
jmansurf
위의 많은 답변에서 언급했듯이 ===
case
/ when
문에서 후드 아래에서 사용됩니다.
다음은 해당 연산자에 대한 추가 정보입니다.
대소문자 같음 연산자: ===
String, Range 및 Regexp와 같은 Ruby의 많은 내장 클래스는 "case-equality", "triple equals" 또는 "threeequals"라고도 ===
각 클래스에서 다르게 구현되기 때문에 호출된 개체 유형에 따라 다르게 동작합니다. 일반적으로 오른쪽에 있는 개체가 왼쪽에 있는 개체에 "속하거나" "그의 구성원"이면 true를 반환합니다. 예를 들어, 개체가 클래스(또는 하위 클래스 중 하나)의 인스턴스인지 테스트하는 데 사용할 수 있습니다.
String === "zen" # Output: => true Range === (1..2) # Output: => true Array === [1,2,3] # Output: => true Integer === 2 # Output: => true
is_a?
와 같이 작업에 가장 적합한 다른 방법으로도 동일한 결과를 얻을 수 있습니다. 그리고 instance_of?
.
===
범위 구현
===
연산자가 범위 객체에서 호출될 때 오른쪽 값이 왼쪽 범위 내에 있으면 true를 반환합니다.
(1..4) === 3 # Output: => true (1..4) === 2.345 # Output: => true (1..4) === 6 # Output: => false ("a".."d") === "c" # Output: => true ("a".."d") === "e" # Output: => false
===
연산자는 왼쪽 객체 ===
메서드를 호출한다는 것을 기억하십시오. 따라서 (1..4) === 3
은 (1..4).=== 3
. 즉, 왼쪽 피연산자의 클래스는 ===
메서드의 어떤 구현이 호출되는지 정의하므로 피연산자 위치를 서로 바꿀 수 없습니다.
===
정규 표현식 구현
오른쪽의 문자열이 왼쪽의 정규식과 일치하면 true를 반환합니다.
/zen/ === "practice zazen today" # Output: => true # is similar to "practice zazen today"=~ /zen/
위의 두 예제 사이의 유일한 관련 차이점은 일치하는 경우 ===
가 true를 반환하고 =~
가 정수를 반환한다는 것입니다. 이는 Ruby의 진실 값입니다. 곧 다시 돌아올 것입니다.
BrunoF
puts "Recommend me a language to learn?" input = gets.chomp.downcase.to_s case input when 'ruby' puts "Learn Ruby" when 'python' puts "Learn Python" when 'java' puts "Learn Java" when 'php' puts "Learn PHP" else "Go to Sleep!" end
Prabhakar Undurthi
나는 사용하기 시작했다:
a = "secondcase" var_name = case a when "firstcase" then "foo" when "secondcase" then "bar" end puts var_name >> "bar"
경우에 따라 코드를 압축하는 데 도움이 됩니다.
deepfritz
$age = 5 case $age when 0 .. 2 puts "baby" when 3 .. 6 puts "little child" when 7 .. 12 puts "child" when 13 .. 18 puts "youth" else puts "adult" end
자세한 내용은 " Ruby - if...else, case, Without "를 참조하십시오.
Navneet
when
절에서 ,
)를 강조하는 것이 중요합니다. ||
의 if
문입니다, 그것은의 구분 표현 사이에 OR 비교 아닌 AND 비교를 수행 when
절을. 다음 사례 설명을 참조하십시오.
x = 3 case x when 3, x < 2 then 'apple' when 3, x > 2 then 'orange' end => "apple"
x
는 2보다 작지 않지만 반환 값은 "apple"
입니다. 왜요? x
가 3이고 ',`` acts as an
|| , 표현식 x < 2' , it did not bother to evaluate the expression
AND 를 수행하기 위해 아래와 같이 할 수 있다고 생각할 수도 있지만 작동하지 않습니다.
case x when (3 && x < 2) then 'apple' when (3 && x > 2) then 'orange' end => nil
(3 && x > 2)
가 true로 평가되고 Ruby가 True 값을 취하여 x
가 3이므로 true가 아닌 ===
x
와 비교하기 때문에 작동하지 않습니다.
&&
비교를 하려면 if
/ else
블록처럼 case
를 처리해야 합니다.
case when x == 3 && x < 2 then 'apple' when x == 3 && x > 2 then 'orange' end
루비 프로그래밍 언어 책에서 마츠는이 후자의 형태에 대한 대안 구문에 불과하다 간단한 (그리고 자주 사용) 형태 말합니다 if
/ elsif
/ else
. 그러나 자주 사용되지 않는지 여부에 관계없이 주어진 when
절 &&
Daniel Viglione
환경에서 정규식을 지원하지 않습니까? 예: Shopify 스크립트 편집기 (2018년 4월):
[오류]: 초기화되지 않은 상수 RegExp
이전에 here 및 here 에서 이미 다룬 방법 조합에 따른 해결 방법:
code = '!ADD-SUPER-BONUS!' class StrContains def self.===(item) item.include? 'SUPER' or item.include? 'MEGA' or\ item.include? 'MINI' or item.include? 'UBER' end end case code.upcase when '12345PROMO', 'CODE-007', StrContains puts "Code #{code} is a discount code!" when '!ADD-BONUS!' puts 'This is a bonus code!' else puts 'Sorry, we can\'t do anything with the code you added...' end
||
이후로 클래스 메서드 문에서 or
s를 사용했습니다. .include보다 우선 순위가 높 .include?
.
||
사용을 선호한다면 , 비록 이 경우 or
가 바람직하지만 대신 다음을 수행할 수 있습니다: (item.include? 'A') || ...
. 이 repl.it 에서 테스트할 수 있습니다.
CPHPython
여러 조건에 대해 switch 문을 작성할 수 있습니다.
예를 들어,
x = 22 CASE x WHEN 0..14 THEN puts "#{x} is less than 15" WHEN 15 THEN puts "#{x} equals 15" WHEN 15 THEN puts "#{x} equals 15" WHEN 15..20 THEN puts "#{x} is greater than 15" ELSE puts "Not in the range, value #{x} " END
Foram
case
문 연산자는 다른 언어의 switch
이것은 C에서 switch...case
의 구문입니다:
switch (expression) { case constant1: // statements break; case constant2: // statements break; . . . default: // default statements }
다음은 Ruby에서 case...when
의 구문입니다.
case expression when constant1, constant2 #Each when statement can have multiple candidate values, separated by commas. # statements next # is like continue in other languages when constant3 # statements exit # exit is like break in other languages . . . else # statements end
예를 들어:
x = 10 case x when 1,2,3 puts "1, 2, or 3" exit when 10 puts "10" # it will stop here and execute that line exit # then it'll exit else puts "Some other number" end
자세한 내용은 case
문서를 참조하십시오.
Ben96
"보다 작거나" "보다 큼"이 필요한 경우:
case x when 1..5 "It's between 1 and 5" when 6 "It's 6" when 7..1.0/0 "It's equal or greater than 7" when -1.0/0..0 "It's equal or less than 0" end
1.0/0
은 Float::INFINITY
와 같으므로 원하는 것을 사용할 수 있습니다.
Paulo Belo
나는 case +를 사용하는 것을 선호한다
number = 10 case number when 1...8 then # ... when 8...15 then # ... when 15.. then # ... end
AlexSh
Ruby는 대신 case 표현식을 지원합니다.
클래스 매칭:
case e = StandardError.new("testing") when Exception then puts "error!" else puts "ok!" end # => error!
여러 값 일치:
case 3 when 1,2,3 then puts "1..3" when 4,5,6 then puts "4..6" else puts "?" end # => 1..3
정규식 평가:
case "monkey" when /mon/ then puts "banana" else puts "?" end # => banana
Moriarty
출처 : http:www.stackoverflow.com/questions/948135/how-to-write-a-switch-statement-in-ruby
'etc. > StackOverFlow' 카테고리의 다른 글
SCSS와 Sass의 차이점은 무엇입니까? (0) | 2021.12.02 |
---|---|
PHP 'foreach'는 실제로 어떻게 작동합니까? (0) | 2021.12.02 |
모든 git 하위 모듈의 최신 버전을 가져오는 쉬운 방법 (0) | 2021.12.02 |
Docker 컨테이너 내부에서 머신의 로컬 호스트에 어떻게 연결합니까? (0) | 2021.12.02 |
C# 자동 속성에 초기 값을 제공하는 가장 좋은 방법은 무엇입니까? (0) | 2021.12.02 |