Питання Як написати оператор switch в Ruby?


Як написати запис оператора switch в Ruby?


1833
2018-06-04 01:18


походження




Відповіді:


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's case не має провалюватися, тому немає необхідності закінчити кожен when з break. Ви також можете вказати кілька відповідей в одному when застереження як when "foo", "bar".


2306
2018-06-04 01:22



railsless.blogspot.com/2011/01/... - Pankaj
Ви також можете зробити регулярний вираз на переданому аргументі: when / thisisregex / наступний рядок  ставить "Це знайдено відповідність номеру 1 # {$ 1}" на кінець - Automatico
Також варто зазначити, що ви можете скоротити свій код, поставивши його when і return заява на тій же лінії: when "foo" then "bar" - Alexander


case...when поводиться трохи несподівано під час обробки класів. Це пов'язано з тим, що він використовує === оператор

Цей оператор працює так, як очікувалося, з літералами, але не з класами:

1 === 1           # => true
Fixnum === Fixnum # => false

Це означає, що якщо ви хочете зробити a 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')
end

Буде надруковано "Це не рядок".

На щастя, це легко вирішити. The === Оператор визначений таким чином, що він повертається 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')
end

Я натискаю цю проблему сьогодні, коли шукаю відповідь, і це була перша з'являюча сторінка, тому я вирішив, що буде корисно для інших у моїй же ситуації.


397
2018-04-17 15:20



obj = 'hello'; case obj; коли "Привіт" потім ставить "Це привіт" кінця - v Sugumar


Це зроблено справа в Рубі Також див ця стаття на Вікіпедії.

Цитувати:

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

На сторінці 123 (я використовую Kindle) Рубінове програмування Lanugage (Перше видання, О'Рейлі), це говорить then ключове слово, яке слідує за when Записи можуть бути замінені новим рядком або точкою з комою (як і в if then else синтаксис) (Ruby 1.8 також дозволяє двокрапку на місці then... Але цей синтаксис більше не дозволяється в Ruby 1.9).


187
2018-06-04 01:20



when (-1.0/0.0)..-1 then "Epic fail" - Andrew Grimm
Це відповідь, яку я використав, тому що я визначаю змінну на основі результатів перемикача. Замість того, щоб говорити type = #{score} Кожна лінія, я можу просто скопіювати те, що зробили. Набагато елегантніше, мені також подобається один-вкладиші набагато краще (якщо це можливо) - onebree


    випадок ... коли

Щоб додати ще кілька прикладів Чак відповідає:

За допомогою параметра:

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

Будь ласка, зверніть увагу питання що кикито попереджає.


88
2017-07-05 13:19



Дякуємо, це було корисно для того, щоб мати кілька варіантів на одній лінії. Я намагався використовувати or - sixty4bit


Багато мов програмування, особливо ті, що отримані від C, мають підтримку так званих Переключити падіння. Я шукав кращого способу зробити те ж саме в 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', але, здебільшого, я вважаю, що це досить схожий, щоб бути корисним таким же чином.


64
2017-12-07 12:11





У 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

(Приклад з "Чи можна використовувати procs для опису справ у 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 Case і що ви можете зробити з ним".)


63
2017-08-01 00:04





Ви можете використовувати регулярні вирази, такі як пошук типу рядка:

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's case буде використовувати операнд рівності === за це (дякую @ JimDeville). Додаткова інформація доступна на сторінці "Рубінові оператори". Це також можна зробити, використовуючи приклад @mmdemirbas (без параметра), тільки цей підхід є чистим для цих типів випадків.


47
2017-10-16 12:17





Якщо ви хочете знати, як використати стан OR у випадку Ruby switch:

Отже, в a case заява, а , є еквівалентом || в if заява

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

Багато інших речей ви можете зробити з твердженням Ruby case


29
2017-07-03 06:46