Pytanie Jak napisać instrukcję zmiany w Ruby?


Jak napisać instrukcję zmiany w Ruby?


1833
2018-06-04 01:18


pochodzenie




Odpowiedzi:


Ruby używa case wyrażenie zamiast.

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 porównuje obiekt w when klauzula z obiektem w case klauzula używająca === operator. Na przykład, 1..5 === x, i nie x === 1..5.

To pozwala na wyrafinowane when klauzule widziane powyżej. Zakresy, klasy i wszelkiego rodzaju rzeczy mogą być testowane zamiast na równość.

w odróżnieniu switch wypowiedzi w wielu innych językach, Ruby's case nie ma upadek, więc nie trzeba ich kończyć when z a break. Możesz także określić wiele dopasowań w jednym when klauzula taka jak when "foo", "bar".


2306
2018-06-04 01:22



railsless.blogspot.com/2011/01/... - Pankaj
Możesz także wykonać wyrażenie regularne na przekazanym argumencie: when / thisisregex / następna linia  umieszcza "To jest znaleziony nr meczu. 1 # {$ 1}" - Automatico
Warto również zauważyć, że możesz skrócić swój kod, wstawiając when i return oświadczenie w tej samej linii: when "foo" then "bar" - Alexander


case...when zachowuje się nieco nieoczekiwanie podczas obsługi klas. Wynika to z faktu, że używa on === operator.

Ten operator działa zgodnie z oczekiwaniami z literałami, ale nie z klasami:

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

Oznacza to, że jeśli chcesz zrobić case ... when nad klasą obiektu, to nie zadziała:

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

Wyświetli "To nie jest łańcuch".

Na szczęście można to łatwo rozwiązać. The === operator został zdefiniowany tak, aby powrócił true jeśli użyjesz go z klasą i dostarczysz instancję tej klasy jako drugi operand:

Fixnum === 1 # => true

W skrócie, powyższy kod można naprawić, usuwając plik .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

Dziś uderzyłem w ten problem, szukając odpowiedzi, i to była pierwsza pojawiająca się strona, więc pomyślałem, że przyda się ona innym w tej samej sytuacji.


397
2018-04-17 15:20



obj = 'hello'; case obj; kiedy "cześć" kończy się "cześć" - v Sugumar


Jest to zrobione przez walizka w Ruby. Zobacz także ten artykuł na Wikipedii.

Zacytowany:

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

Inny przykład:

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

Na stronie 123 (Używam Kindle) z The Ruby Programming Lanugage (1st Edition, O'Reilly), mówi then słowo kluczowe po when klauzule można zastąpić znakiem nowej linii lub średnikiem (podobnie jak w if then else składnia). (Ruby 1.8 pozwala również na dwukropek zamiast then... Ale ta składnia nie jest już dozwolona w Rubim 1.9.)


187
2018-06-04 01:20



when (-1.0/0.0)..-1 then "Epic fail" - Andrew Grimm
To jest odpowiedź, której użyłem, ponieważ definiuję zmienną w oparciu o wyniki przełącznika przypadku. Zamiast mówić type = #{score} w każdej linii mogę po prostu skopiować to, co zrobiłeś. O wiele bardziej elegancka Bardzo podoba mi się też ta jedna liniówka (jeśli to możliwe) - onebree


    sprawa ... kiedy

Aby dodać więcej przykładów do Odpowiedź Chucka:

Z parametrem:

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

Bez parametru:

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

Proszę, bądź świadomy problem że Kikito ostrzega.


88
2017-07-05 13:19



Dzięki, było to pomocne w przypadku wielu opcji w jednym wierszu. Próbowałem użyć or - sixty4bit


Wiele języków programowania, zwłaszcza tych pochodzących z C, ma wsparcie dla tzw Przełącz Fallthrough. Szukałem najlepszego sposobu, aby zrobić to samo w Ruby i pomyślałem, że może być użyteczne dla innych:

W językach podobnych do C typowo wygląda to tak:

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;
}

W Ruby to samo można osiągnąć w następujący sposób:

case expression
when 'a', 'b', 'c'
  # Do something for a, b or c
when 'd', 'e'
  # Do something else for d or e
end

Nie jest to ściśle równoważne, ponieważ nie można na to pozwolić 'a' wykonaj blok kodu przed przejściem do 'b' lub 'c', ale w większości przypadków uważam, że jest na tyle podobny, aby być użytecznym w ten sam sposób.


64
2017-12-07 12:11





W Ruby 2.0 możesz także użyć lambdas w case następujące oświadczenia:

is_even = ->(x) { x % 2 == 0 }

case number
when 0 then puts 'zero'
when is_even then puts 'even'
else puts 'odd'
end

Można również łatwo tworzyć własne komparatory za pomocą Struct z niestandardowym ===

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

(Przykład wzięty z "Czy procy mogą być używane z instrukcją case w Ruby 2.0?".)

Lub z pełną klasą:

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

(Przykład wzięty z "Jak działa Oświadczenie o Ruby Case i co można z nim zrobić".)


63
2017-08-01 00:04





Możesz użyć wyrażeń regularnych, takich jak znalezienie typu ciągu znaków:

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 użyje argumentu równości === za to (dzięki @JimDeville). Dodatkowe informacje są dostępne w "Operatorzy RubyMożna to również zrobić za pomocą przykładu @mmdemirbas (bez parametru), tylko to podejście jest czystsze dla tego typu przypadków.


47
2017-10-16 12:17





Jeśli chcesz wiedzieć, jak używać warunku OR w przypadku przełącznika Ruby:

Tak więc w a case oświadczenie, , jest odpowiednikiem || w if komunikat.

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

Wiele innych rzeczy, które możesz zrobić za pomocą instrukcji Ruby case


29
2017-07-03 06:46





To jest nazwane case i działa tak, jak byś tego oczekiwał, plus dużo więcej fajnych rzeczy dzięki uprzejmości === który wdraża testy.

case 5
  when 5
    puts 'yes'
  else
    puts 'else'
end

Teraz dla zabawy:

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

I okazuje się, że możesz również zastąpić dowolny łańcuch if / else (to znaczy, nawet jeśli testy nie zawierają wspólnej zmiennej) z case przez pominięcie pierwszego case Parametr i po prostu wyrażanie wyrażeń, w którym pierwszy mecz jest zgodny z oczekiwaniami.

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

24
2018-02-05 20:40





Od switch case zawsze zwraca pojedynczy obiekt, możemy bezpośrednio wydrukować jego wynik:

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

18
2017-11-05 07:29