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
폴스루가 없으므로 각각 종료할 필요가 없습니다.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
case 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 조건을 사용하는 방법을 알고 싶은 경우:
그래서, 잠시 후에.case
a, 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를 쓸 수 있습니다.case
Ruby에서 두 가지 다른 방식으로 표현합니다.
- 의 일의작업유사다니합과련▁a▁of▁to▁series와 유사합니다.
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
좀 더 자연스러운 방법으로 이렇게 할 수 있고,
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 expression
x < 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
와 함께===
그것은 사실이 아닙니다, 왜냐하면x
3입니다.
행기하실을 하는 것.&&
비교하면, 당신은 치료를 해야 할 것입니다.case
if
/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...case
C:
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
매우 강력한 기능입니다.
사용하기도 합니다.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
'programing' 카테고리의 다른 글
Eclipse 오류: 필요한 .class 파일에서 간접적으로 참조됩니까? (0) | 2023.05.31 |
---|---|
Ruby에서 파일 경로에서 확장자 없이 파일 이름을 가져오는 방법 (0) | 2023.05.31 |
Azure Storage Client 2.0의 다른 BLOB로 한 Azure Blob 복사 (0) | 2023.05.26 |
IIS 7.0에서 "HTTP 오류 500.19 - 내부 서버 오류"를 해결하는 방법 (0) | 2023.05.26 |
PostgreSQL에서 읽기 전용 사용자를 어떻게 생성합니까? (0) | 2023.05.26 |