case用法 - ruby case



如何在Ruby中編寫switch語句? (14)

我如何在Ruby中編寫switch語句?


Answer #1

情況......當

為了給查克的答案增加更多的例子:

帶參數:

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警告的問題 。


Answer #2

Ruby使用這種case編寫switch語句。

根據Ruby文檔

案例陳述由一個可選條件組成,該條件位於case參數的位置,並且when子句when為零個或多個。 第一個when子句匹配條件(或者評估為布爾真值,如果條件為空)“勝出”,並且其代碼段被執行。 case語句的值是when子句的成功值,如果沒有這樣的子句,則為nil

case語句可以以else子句結束。 每個語句可以有多個候選值時,用逗號分隔。

例:

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

Honeybadger這篇博客描述了Ruby Case;

可以與Ranges一起使用:

case 5
when (1..10)
  puts "case statements match inclusion in a range"
end

## => "case statements match inclusion in a range"

可以和正則Regex一起使用:

case "FOOBAR"
when /BAR$/
  puts "they can match regular expressions!"
end

## => "they can match regular expressions!"

可以和Procs和Lambdas一起使用:

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

Answer #3

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

如上所述,這允許複雜的子句。 可以測試範圍,類和各種事物,而不僅僅是平等。

與許多其他語言中的switch語句不同,Ruby的case並沒有出現fall-through ,所以在break when不需要結束每個語句。 您也可以在單個when子句中指定多個匹配項,例如when "foo", "bar"


Answer #4

不支持您環境中的正則表達式? 例如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 比.include?有更高的優先級.include? 。 如果你是一個ruby-nazi ,請想像我使用了這個(item.include? 'A') || ... 相反。 repl.it測試。


Answer #5

在Ruby 2.0中,您還可以在case語句中使用lambdas,如下所示:

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案例聲明的工作原理和你能做什麼 ”的例子。)


Answer #6

多值時和不值值情況:

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

Answer #7

它被稱為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
  when x.nil?
    ...
  when (x.match /'^fn'/)
    ...
  when (x.include? 'substring')
    ...
  when x.gsub('o', 'z') == 'fnzrq'
    ...
  when Time.now.tuesday?
    ...
end


Answer #9

您可以用兩種不同的方式在ruby中編寫case表達式。

  1. 類似於一系列“if”陳述
  2. 指定案例旁邊的目標,並將每個“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

Answer #10

我已經開始使用:

a = "secondcase"

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

puts var_name
>> "bar"

它有助於在某些情況下壓縮代碼。


Answer #11

正如上面的許多答案所述,===操作符在case / when語句的底層使用。

以下是關於該操作員的一些額外信息。

案例相等運算符:===

許多Ruby的內置類(如String,Range和Regexp)提供了它們自己的===運算符實現,也稱為case-equality,triple equals或threequals。 因為它在每個類中的實現方式不同,所以它的行為將有所不同,具體取決於所調用對象的類型。 通常,如果右側的對象“屬於”或“是左側的對象的成員”,則返回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 / ===“今天練習zazen”#輸出:=> true#與“今日練習zazen”類似=〜/ zen /

上面兩個例子唯一相關的區別是,當匹配時,===返回true,並且=〜返回一個整數,這是Ruby中的一個真值。 我們會盡快回复。


Answer #12

由於switch case總是返回一個對象,我們可以直接打印它的結果:

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

Answer #13

這是通過Ruby中的case完成的。 另請參閱維基百科上的這篇文章

引:

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

Ruby Programming Programming Lanugage (第1版,O'Reilly)的第123頁(我正在使用Kindle)中,它表示when子句後面的then關鍵字可以用換行符或分號代替(就像在if then else語句的if then else語法中一樣)。 (Ruby 1.8也允許冒號代替...但是這個語法在Ruby 1.9中不再允許。)






conditional