Soru Ruby'de nasıl bir anahtar deyimi yazılır?


Ruby'de nasıl bir anahtar deyimi yazarım?


1833
2018-06-04 01:18


Menşei




Cevaplar:


Ruby kullanır case ifade yerine.

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 nesneyi when nesnesindeki nesne ile case kullanarak yan tümce === Şebeke. Örneğin, 1..5 === x, ve yok x === 1..5.

Bu sofistike için izin verir when yukarıdaki gibi hükümler. Aralıklar, sınıflar ve her tür şey sadece eşitlikten ziyade test edilebilir.

aksine switch Diğer birçok dilde ifadeler, Ruby’nin case bulunmamaktadır suya düşmekYani her birini bitirmeye gerek yok when Birlikte break. Aynı zamanda, birden fazla eşleşme belirtebilirsiniz when yan tümce when "foo", "bar".


2306
2018-06-04 01:22



railsless.blogspot.com/2011/01/... - Pankaj
Geçilen argümanda regex de yapabilirsiniz: when / thisisregex / Sonraki satır  koyar "Bu bulunan eşleşme no. 1 # {$ 1}" sonu - Automatico
Ayrıca not etmeye değer, kodunuzu when ve return aynı satırdaki ifade: when "foo" then "bar" - Alexander


case...when Sınıfları kullanırken beklenmedik bir şekilde davranır. Bunun nedeni, === Şebeke.

Bu işleç, hazır bilgi ile beklendiği gibi çalışır, ancak sınıflarla değil:

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

Bu, eğer bir case ... when Bir nesnenin sınıfı üzerinde, bu işe yaramaz:

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

"Dize değil" yazdıracak.

Neyse ki, bu kolayca çözülür. === operatör döndürülecek şekilde tanımlandı true Bir sınıfla kullanırsanız ve ikinci işlenen olarak bu sınıfın bir örneğini sağlarsanız:

Fixnum === 1 # => true

Kısaca, yukarıdaki kod çıkarılarak sabitlenebilir. .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

Bugün bu soruna bir cevap ararken vurdum ve bu ilk görünen sayfa oldu, bu yüzden aynı durumdaki diğerlerine de faydalı olacağını düşündüm.


397
2018-04-17 15:20



obj = 'merhaba'; case obj; "merhaba" ne zaman "merhaba" diye koyar - v Sugumar


Tarafından yapılır dava Ruby'de. Ayrıca bkz. Bu yazı Vikipedi'de.

Alıntı:

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

Başka bir örnek:

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 Sayfasında (Kindle kullanıyorum) Ruby Programlama Lanugage (1. Baskı, O'Reilly), diyor ki then anahtar kelimeyi izleyen when cümleleri bir satırsonu veya noktalı virgülle değiştirilebilir (tıpkı if then else sözdizimi). (Ruby 1.8 ayrıca bir kolonun yerine then... Ama bu sözdizimine artık Ruby 1.9'da izin verilmiyor.)


187
2018-06-04 01:20



when (-1.0/0.0)..-1 then "Epic fail" - Andrew Grimm
Kullandığım cevap budur çünkü bir anahtarın sonuçlarına dayalı bir değişken tanımlıyorum. Söylemek yerine type = #{score} Her satır, yaptığınız şeyi kopyalayabilirim. Çok daha zarif Ben de tek gömlekleri çok daha iyi (mümkünse) - onebree


    vaka ... ne zaman

Daha fazla örnek eklemek için Chuck'ın cevabı:

Parametre ile:

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

Parametre olmadan:

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

Lütfen, farkında olun sorun Bu kikito uyardı.


88
2017-07-05 13:19



Teşekkürler, bu bir satırda birden fazla seçenek olması için yardımcı oldu. Kullanmaya çalışıyordum or - sixty4bit


Birçok programlama dili, özellikle C'den türetilenler, sözde için destek var Geçişi Değiştir. Ruby'de aynı şeyi yapmanın en iyi yolunu arıyordum ve başkalarına yararlı olabileceğini düşündüm:

C gibi dillerdeki diller genellikle aşağıdakine benzer:

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'de, aynı şekilde aşağıdaki gibi elde edilebilir:

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

Bu kesinlikle eşdeğer değil çünkü izin vermek mümkün değil 'a' içine düşmeden önce bir kod bloğu yürütmek 'b' veya 'c'ama çoğu zaman aynı şekilde yararlı olacak kadar benzer buluyorum.


64
2017-12-07 12:11





Ruby 2.0'da, lambdaları da case ifadeleri, aşağıdaki gibi:

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

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

Ayrıca, bir Özel ile bir Struct kullanarak kendi karşılaştırıcılarınızı kolayca oluşturabilirsiniz ===

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

(Örnek alınan "Ruby 2.0'da vaka bildirimleri ile provalar kullanılabilir mi?".)

Veya tam bir sınıfla:

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

(Örnek alınan "Bir Ruby Case Bildirimi Nasıl Çalışır Ve Bununla Yapabilecekleriniz".)


63
2017-08-01 00:04





Bir dize türü bulmak gibi düzenli ifadeleri kullanabilirsiniz:

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'nin case eşitlik işlenenini kullanacak === bunun için (teşekkürler @JimDeville). Daha fazla bilgi "Ruby Operatörleri"Bu da @mmdemirbas örneği kullanılarak yapılabilir (parametre olmadan), sadece bu yaklaşım bu tip durumlar için daha temizdir.


47
2017-10-16 12:17





Bir Ruby anahtar durumunda bir OR koşulunun nasıl kullanılacağını bilmek için istekliyiz:

Yani, bir case deyim, bir , eşdeğeri || içinde if Beyan.

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

Ruby vaka bildirimi ile yapabileceğiniz pek çok şey


29
2017-07-03 06:46





Denir case ve beklediğiniz gibi çalışıyor, artı çok daha eğlenceli şeyler nezaket === Bu testleri uygular.

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

Şimdi biraz eğlenmek için:

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

Ayrıca, eğer / else zincirinin (yani, sınamalar ortak bir değişken içermiyor olsa bile) bir rastgele yerini alabilir. case başlangıçta bırakarak case parametre ve sadece ilk eşleşmenin istediği şey olduğu ifadeleri yazmak.

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