programing

Ruby로 스위치 문을 작성하는 방법

goodsources 2023. 5. 31. 15:51
반응형

Ruby로 스위치 문을 작성하는 방법

▁a?까 어떻게 쓰나요?switch루비로 된 진술?

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

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로 된 문장들, 루비의 된진들술어언많로은의루비다, 른의▁state▁inments.case폴스루가 없으므로 각각 종료할 필요가 없습니다.whenbreak의 "" " " " " " " " " " 에 일치하는 항목을 개 .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

간단히 말해서, 위의 코드는 다음을 제거함으로써 수정될 수 있습니다..classcase obj.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 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

내 킨들에 있는 루비 프로그래밍 언어(1판, 오라일리) 123페이지쯤에 다음과 같이 나와 있습니다.then 뒤에 오는 when절은 새로운 줄이나 세미콜론으로 대체될 수 있습니다.if then else구문)을 선택합니다.(Ruby 1.8은 또한 다음과 같은 대신 콜론을 허용합니다.then그러나 이 구문은 Ruby 1.9에서 더 이상 허용되지 않습니다.)

케이스...언제

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

키키토가 경고하는 "Ruby로 스위치문 작성하는 방법"에 유의하시기 바랍니다.

에서는 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

또한 사용자 정의 구조를 사용하여 자신만의 비교기를 쉽게 만들 수 있습니다.===

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의 경우 설명문과 함께 프로시저를 사용할 수 있습니까?"에서 가져온 예)

또는 전체 클래스를 포함하는 경우:

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의 작동 방식과 사용할 수 있는 작업"에서 가져온 예)

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

C-like 언어에서는 일반적으로 다음과 같은 오류가 발생합니다.

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'하지만 대부분은 같은 방식으로 유용할 정도로 비슷하다고 생각합니다.

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

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 등호피사용다니를 합니다.===감사합니다 (Jim Deville @Jim Deville 감사합니다.추가 정보는 "Ruby Operators"에서 확인할 수 있습니다.이는 @mmdemirbas 예제(파라미터 없이)를 사용하여 수행할 수도 있으며, 이러한 유형의 사례에 대해서는 이 접근법만 더 깨끗합니다.

고라합니다라고 불립니다.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

if/ 체인변수가을 if/else로 바꿀 도 있습니다.case이니셜을 생략함으로써.case매개 변수 및 첫 번째 일치가 원하는 위치에 식을 쓰는 것입니다.

case
  when x.nil?
    ...
  when (x.match /'^fn'/)
    ...
  when (x.include? 'substring')
    ...
  when x.gsub('o', 'z') == 'fnzrq'
    ...
  when Time.now.tuesday?
    ...
end

Ruby 스위치 케이스에서 OR 조건을 사용하는 방법을 알고 싶은 경우:

그래서, 잠시 후에.casea, a, a,의 값과 같습니다.||순식간에if진술.

case car
   when 'Maruti', 'Hyundai'
      # Code here
end

"Ruby Case Statement의 작동 방식사용할 수 있는 작업"을 참조하십시오.

는 루비를 합니다.case스위치 문을 작성하는 데 사용됩니다.

설명서에 따라 다음 작업을 수행합니다.

조건으로 되는데, 례진술다같위있선는조구다에 .case 0 0 이상인 경우when조항첫번째when조건을 일치시키는 절(또는 조건이 null인 경우 부울 진리로 평가하는 절) "win"하고 해당 코드 스탠자가 실행됩니다.의 값입니다.when절, 또nil그러한 조항이 없는 경우에는

는 " 례문다끝수날있니다습로으사장은음다로 끝날 수 .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 및 Lamdas와 함께 사용할 수 있습니다.

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

사용자의 경우에 따라 메서드 해시를 사용하는 것을 선호할 수 있습니다.

이 긴 when할 수 인 값이 (이 아니라) 그런 더입니다. s 각 간 은 (각 아 닌 이 격 있 으 고 며 가 지 해 관 및 메 선 의 시 서 메 입 적 니 다 효 과 더 것 이 호 는 하 드 출 를 드 서 련 를 서 다 해 에 언 시 한 음

# 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])

때부터switch case항상 단일 개체를 반환하므로 결과를 직접 인쇄할 수 있습니다.

puts case a
     when 0
        "It's zero"
     when 1
        "It's one"
     end

다중값 대/소문자 구분:

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

다니있습다▁write를 쓸 수 있습니다.caseRuby에서 두 가지 다른 방식으로 표현합니다.

  1. 의 일의작업유사다니합과련▁a▁of▁to▁series와 유사합니다.if
  2. 대상지 옆에 합니다.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

좀 더 자연스러운 방법으로 이렇게 할 수 있고,

case expression
when condtion1
   function
when condition2
   function
else
   function
end

많은 훌륭한 답변들이 있지만 저는 한 가지 사실을 덧붙일 것이라고 생각했습니다.물체(클래스)를 비교하려는 경우 우주선 방법(장난이 아님)이 있는지 확인하거나 비교 방법을 이해해야 합니다.

"루비 평등과 객체 비교"는 이 주제에 대한 좋은 토론입니다.

답변에서 한 바와 , 위의많답언바와같이급된서변에은,같▁as▁the위이,바와,===는 산자는의아사용됩다니서래에드후연의 후드 됩니다.case/when진술들.

다음은 해당 연산자에 대한 추가 정보입니다.

/소문자를 구분하는 연산자:===

String,Ruby의 내장 는 String, Range, Regexp의 합니다.===연산자, "대소문자 구분", "대소문자 구분" 또는 "세 개의 등식"이라고도 합니다.클래스마다 다르게 구현되므로 호출된 개체의 유형에 따라 다르게 동작합니다.일반적으로 오른쪽에 있는 개체가 왼쪽에 있는 개체에 속하거나 "구성원"이면 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

▁the라는 것을 기억하세요.===는 연자가호다니합산을 합니다.===왼쪽 객체의 메서드입니다.그렇게(1..4) === 3는 와동합다니등다에 합니다.(1..4).=== 3는 즉, 왼피연클의다래음구정현다의니합을의 어떤 을 정의합니다.===메소드가 호출되므로 피연산자 위치는 서로 교환할 수 없습니다.

Regexp »===

오른쪽의 문자열이 왼쪽의 정규식과 일치하면 true를 반환합니다.

/zen/ === "practice zazen today"  # Output: => true
# is similar to
"practice zazen today"=~ /zen/

의 두 은 일치하는 위두사의유일관있련성는때차일내있을용치이는하은이점례한때,,,▁there▁the▁that있▁above을▁match▁relevantrence,=== 및 true를 합니다.=~Ruby의 참 값인 정수를 반환합니다.우리는 곧 이것으로 돌아갈게요.

"보다 작음" 또는 "보다 큼"이 필요한 경우:

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당신이 선호하는 것을 사용할 수 있습니다.

Ruby 2.6 이후에는 Endless Ranges를 사용할 수 있고 Ruby 2.7 이후에는 Beginless Ranges를 사용할 수 있으므로 다음과 같은 작업을 수행할 수 있습니다.

case x
when 1..5
  "It's between 1 and 5"
when 6
  "It's 6"
when (7..)
  "It's equal or greater than 7"
when (..0)
  "It's equal or less than 0"
end
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

사용하기 시작했습니다.

a = "secondcase"

var_name = case a
  when "firstcase" then "foo"
  when "secondcase" then "bar"
end

puts var_name
>> "bar"

경우에 따라 코드를 압축하는 데 도움이 됩니다.

$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, unife"를 참조하십시오.

합니다.,)에서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||, it did not bother to evaluate the expressionx < 2'

AND를 수행하기 위해 아래와 같은 작업을 수행할 수 있다고 생각할 수 있지만 작동하지 않습니다.

case x
  when (3 && x < 2) then 'apple'
  when (3 && x > 2) then 'orange'
end
 => nil 

작동하지 않습니다. 왜냐하면.(3 && x > 2)true로 되며, 하여 Ruby는 True와 합니다.x와 함께===그것은 사실이 아닙니다, 왜냐하면x3입니다.

행기하실을 하는 것.&&비교하면, 당신은 치료를 해야 할 것입니다.caseif/else슬라이드:

case
  when x == 3 && x < 2 then 'apple'
  when x == 3 && x > 2 then 'orange'
end

는 이 사용되지 않는, 는 Ruby Programming Language의 대체 .if/elsif/else그러나 자주 사용하지 않거나 여러 개를 연결할 수 있는 다른 방법이 없습니다.&& 떤어식에 when

사용자 환경에서 정규식을 지원하지 않습니까?: Shopify 스크립트 편집기(2018년 4월):

[오류]: 초기화되지 않은 상수 RegExp

이전에 여기와 여기에서 이미 다룬 방법의 조합에 따른 해결 방법:

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▁since서▁class▁method 이후의 클래스 문에 .||는 보우 순선높습다니가위보다 순위가 ..include?.

그도사용선경우는하호을래경우▁using▁prefer를 사용하는 것이 더 좋다면,||이 경우에는 이 작업을 수행하는 이 바람직하지만, 대신 다음 작업을 수행할 수 있습니다.(item.include? 'A') || ...repl.it 에서 테스트할 수 있습니다.

case는 " 연자다같습다니과음는문"와 같습니다.switch타국어로

은 이은다구다니문의 입니다.switch...caseC:

switch (expression)
​{
    case constant1:
      // statements
      break;
    case constant2:
      // statements
      break;
    .
    .
    .
    default:
      // default statements
}

은 이은다구다니문의 입니다.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

자세한 내용은 설명서를 참조하십시오.

여러 조건에 대해 스위치 문을 작성할 수 있습니다.

예를들면,

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

Ruby는 대신 대/소문자 표현식을 지원합니다.

클래스 일치:

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

저는 케이스+를 사용하는 것을 선호합니다.

number = 10

case number
when 1...8 then # ...
when 8...15 then # ...
when 15.. then # ...
end

루비는 2.7에 패턴 매칭을 도입했습니다.

매우 강력한 기능입니다.

사용하기도 합니다.case 다른 .

패턴 찾기 기능도 있습니다.

users =
  { users:
    [
      { user: 'user', email: 'user@user.com' },
      { user: 'admin', email: 'admin@admin.com' },
    ]
  }

case users
in users: [*, { user:, email: /admin/ => admin_email }, *]
  puts admin_email
else
  puts "No admin"
end

# will print admin@admin.com

인 평와달와는 소리리.case, " 조이일않경우을지하치건",NoMatchingPatternError던져질 것입니다.그래서 당신은 아마도 그것을 사용해야 할 것입니다.else

언급URL : https://stackoverflow.com/questions/948135/how-to-write-a-switch-statement-in-ruby

반응형