複数 - ruby if case 速度




Rubyでswitch文を書く方法 (14)

ケース...

チャックの答えに例を追加するには:

パラメータ付き:

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文を書くにはどうすればいいですか?


Ruby 2.0では、次のようにcase文でlambdaを使用することもできます。

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のcase文でprocを使うことができますか? 」)。

または、完全なクラスで:

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のケースステートメントの仕組みとそれを使ってできること 」から抜粋


Rubyはswitch文を書くためにこのcaseを使います。

Ruby Docs

case文は、 case引数の位置にあるオプションの条件と、 when節の0個以上の条件から構成されます。 条件に一致する最初のwhen句(または条件がnullの場合はブール値の真理値に評価する)が「勝ち」、そのコードスタンザが実行されます。 case文の値は成功したwhen節の値です。そうした節がない場合はnilです。

case文は、 else節で終了することができ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

そしてHoneybadgerによるこのブログはRuby Caseについて説明しています。

Rangesで使用でき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


switch case常に単一のオブジェクトを返すので、その結果を直接出力することができます:

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

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文とは異なり、Rubyのcasefall-throughがないため、 breakしたwhenそれぞれ終了する必要はありません。 when "foo", "bar"ようwhen "foo", "bar" 、単一のwhen節に複数の一致を指定することもできます。


あなたの環境での正規表現はサポートされていませんか? 例: Shopify Script Editor (2018年4月):

[エラー]:初期化されていない定数RegExp

既にhereと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

私は、クラスメソッドのステートメントで|| .include?より高い優先順位を.include? 。 あなたが(item.include? 'A') || ...場合、私がこれを使ったと想像してください(item.include? 'A') || ... (item.include? 'A') || ...代わりに。 repl.itテスト。


あなたはもっと自然にこのようにすることができます。

case expression
when condtion1
   function
when condition2
   function
else
   function
end

これは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

これはRubyのcaseによって行われます。 また、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

Ruby Programming Lanugage (第1版、O'Reilly)の123ページ(私はKindleを使用しています)では、 when節のthenキーワードは、改行やセミコロンに置き換えることができます)。 (Ruby 1.8では、代わりにコロンを使用することもできます...しかし、この構文はもはやRuby 1.9では許可されていません)。


多くのプログラミング言語、特に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

これは厳密には等価ではありません。なぜなら'b''c'に落ちる前にコードのブロックを実行することはできませんが、大部分は同じように有用であるのに似ています。


多値の場合と無価値の場合:

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

私は使い始めました:

a = "secondcase"

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

puts var_name
>> "bar"

場合によってはコンパクトなコードに役立ちます。






conditional