Ruby'de bir switch ifadesi nas─▒l yaz─▒l─▒r


Al─▒nan cevaba git


Ruby'de bir switch ifadesini nas─▒l yazar─▒m?


2015









Cevap say─▒s─▒n─▒ say: 23






Ruby bunun yerine case ifadeyi kullan─▒r.

 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 yan t├╝mce nesnesindeki i┼čleci case kullanarak yan t├╝mce nesnesindeki nesneyi kar┼č─▒la┼čt─▒r─▒r === . Mesela 1..5 === x ve de─čil x === 1..5 .

Bu when yukar─▒da g├Âr├╝ld├╝─č├╝ gibi karma┼č─▒k c├╝mlecikleri sa─člar . Aral─▒klar, s─▒n─▒flar ve her t├╝rl├╝ ┼čey e┼čitlikten ziyade test edilebilir.

Aksine switch di─čer bir├žok dilde ifadeleri, Ruby'nin case yok sonbahar-through b├Âylece her bitirmek i├žin gerek yoktur, when bir ile break . Ayr─▒ca, tek bir when c├╝mle i├žinde birden ├žok e┼čle┼čme de belirleyebilirsiniz when "foo", "bar" .


2583







case...when s─▒n─▒flar─▒ kullan─▒rken biraz beklenmedik ┼čekilde davran─▒r. Bu, === operat├Âr├╝ kullanmas─▒ nedeniyledir .

Bu operat├Âr, de─či┼čmezlerle beklendi─či gibi ├žal─▒┼č─▒r, ancak s─▒n─▒flarla ├žal─▒┼čmaz:

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

Bu, case ... when bir nesnenin s─▒n─▒f─▒n─▒n ├╝st├╝nde bir ┼čey yapmak istiyorsan─▒z , bunun i┼če yaramayaca─č─▒ anlam─▒na gelir:

 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 or number')
end
 

"Bu bir dize veya say─▒ de─čil" yazacakt─▒r.

Neyse ki, bu kolayca ├ž├Âz├╝ld├╝. === D├Ând├╝recek ┼čekilde operat├Âr tan─▒mlanm─▒┼čt─▒r true bir s─▒n─▒f ile kullanmak ve ikinci i┼členen olarak bu s─▒n─▒f─▒n bir ├Ârne─čini temin edin:

 Fixnum === 1 # => true
 

K─▒sacas─▒, yukar─▒daki kod a┼ča─č─▒dakileri kald─▒rarak d├╝zeltilebilir .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 or number')
end
 

Bug├╝n bir cevap ararken bu soruna ├žarpt─▒m ve bu ilk g├Âr├╝nen sayfad─▒, bu y├╝zden ayn─▒ durumda ba┼čkalar─▒ i├žin de faydal─▒ olaca─č─▒n─▒ d├╝┼č├╝nd├╝m.


429







Ruby'de durum taraf─▒ndan yap─▒l─▒r . Ayr─▒ca Wikipedia'daki bu makaleye bak─▒n .

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
 

Yak─▒nda , sayfa 123 ( Ruby Kindming Lanugage (1. Bask─▒, O'Reilly) ' nin Kindle'─▒n─▒ kullan─▒yorum ), c├╝mleleri then izleyen anahtar kelimenin when yeni bir sat─▒r veya noktal─▒ virg├╝l (t─▒pk─▒ if then else s├Âzdiziminde oldu─ču gibi) ile de─či┼čtirilebilece─čini s├Âyl├╝yor . (Ruby 1.8 ayn─▒ zamanda yerine bir kolon sa─člar then ... Fakat bu s├Âzdizimine art─▒k Ruby 1.9'da izin verilmemektedir.)


208







vaka ... ne zaman

Chuck'─▒n cevab─▒na daha fazla ├Ârnek eklemek i├žin :

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, kikito'nun uyard─▒─č─▒ sorunun fark─▒nda olun.


99







Pek ├žok programlama dili, ├Âzellikle de C'den t├╝retilenler, Switch Fallthse ( Anahtar De─či┼čimi) olarak adland─▒r─▒lan deste─či destekliyor . Ayn─▒ ┼čeyi Ruby'de yapman─▒n en iyi yolunu ar─▒yordum ve bunun ba┼čkalar─▒ i├žin yararl─▒ olabilece─čini d├╝┼č├╝nd├╝m:

C-benzeri dillerde sonbaharda genellikle ┼č├Âyle g├Âr├╝n├╝r:

 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─▒s─▒ ┼ču ┼čekilde 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─čildir, ├ž├╝nk├╝ veya 'a' koduna d├╝┼čmeden ├Ânce bir kod blo─čunun ├žal─▒┼čt─▒r─▒lmas─▒na izin vermek m├╝mk├╝n de─čildir , ancak ├žo─ču zaman ayn─▒ ┼čekilde yararl─▒ olacak kadar benzer buluyorum. 'b' 'c'


72







Ruby 2.0'da ayr─▒ca lambdas case komutlar─▒n─▒ a┼ča─č─▒daki gibi kullanabilirsiniz :

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

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

├ľzel olarak bir Struct kullanarak kendi kar┼č─▒la┼čt─▒r─▒c─▒lar─▒n─▒z─▒ da 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
 

("├ľrnekler Ruby 2.0'daki vaka ifadeleriyle birlikte kullan─▒labilir mi? ") ├ľrneklerinden al─▒nm─▒┼čt─▒r .)

Veya, eksiksiz 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
 

(" Yakut Bir Vaka ─░fadesi Nas─▒l ├çal─▒┼č─▒r ve Sizinle Yapabilecekleriniz " ├Ârne─činden al─▒nm─▒┼čt─▒r .)


68







Bir dize t├╝r├╝ bulmak gibi normal 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 case bunun i├žin e┼čitlik operand─▒n─▒ kullanacak === (te┼čekk├╝rler @JimDeville). Ek bilgi " Ruby Operators " adresinde bulunabilir . Bu ayr─▒ca @ mmdemirbas ├Ârne─či (parametresiz) kullan─▒larak da yap─▒labilir, yaln─▒zca bu yakla┼č─▒m bu t├╝r durumlar i├žin daha temizdir.


52







Ruby anahtar─▒ durumunda bir OR ko┼čulunun nas─▒l kullan─▒laca─č─▒n─▒ bilmek i├žin istekli iseniz:

Yani, bir de case a├ž─▒klamada, bir , e┼čde─čerdir || bir in if ifadesi.

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

Ruby case deyimi ile yapabilece─činiz bir├žok ┼čey


34







├ça─čr─▒l─▒r case ve bekledi─činiz gibi ├žal─▒┼č─▒r, ayr─▒ca === testleri uygulayan ├žok daha e─členceli ┼čeyler .

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

┼×imdi biraz e─člence 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, rasgele e─čer / else zincirini (yani, testler ortak bir de─či┼čken i├žermese bile) case ba┼člang─▒├ž case parametresini b─▒rakarak ve sadece ilk e┼čle┼čmenin istedi─činiz ┼čeyin oldu─ču ifadeleri yazarak de─či┼čtirebilirsiniz.

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

33







Davan─▒za ba─čl─▒ olarak, ├že┼čitli y├Ântemler kullanmay─▒ tercih edebilirsiniz.

Ne zaman ve her birinin kar┼č─▒la┼čt─▒rmak i├žin (bir aral─▒k de─čil) kar┼č─▒la┼čt─▒r─▒lacak somut bir de─čere sahip uzun bir listesi varsa, bir y├Ântem karma┼čas─▒ bildirmek ve ard─▒ndan bu karma y├Ântemden ilgili y├Ântemi ├ža─č─▒rmak daha etkili olacakt─▒r.

 # Define the hash
menu = {a: :menu1, b: :menu2, c: :menu2, d: :menu3}

# Define the methods
def menu1
  puts 'menu 1'
end

def menu2
  puts 'menu 2'
end

def menu3
  puts 'menu3'
end

# Let's say we case by selected_menu = :a
selected_menu = :a

# Then just call the relevant method from the hash
send(menu[selected_menu])
 

22







Ruby, case for yazma anahtar─▒ ifadelerini kullan─▒r .

Ruby Docs uyar─▒nca :

Vaka ifadeleri, arg├╝man konumunda olan iste─če ba─čl─▒ bir ko┼čuldan case ve s─▒f─▒r veya daha fazla when maddeden olu┼čur. when Ko┼čulu e┼čle┼čtiren ilk ┼čart (ya da ┼čartlar null ise Boole ger├že─čini de─čerlendirmek i├žin) ÔÇťkazan─▒rÔÇŁ ve kodu durdurulamaz. Case deyiminin de─čeri, ba┼čar─▒l─▒ bir when c├╝mlenin de─čeri veya nil b├Âyle bir c├╝mle yoksa.

Bir dava ifadesi bir else maddeyle sona erebilir . Her when bir ifadede, virg├╝lle ayr─▒lm─▒┼č olarak birden fazla aday de─čeri olabilir.

├ľrnek:

 case x
when 1,2,3
  puts "1, 2, or 3"
when 10
  puts "10"
else
  puts "Some other number"
end
 

Daha k─▒sa versiyon:

 case x
when 1,2,3 then puts "1, 2, or 3"
when 10 then puts "10"
else puts "Some other number"
end
 

Honeybadger'─▒n bu blogunda Ruby Case'in tan─▒mlad─▒─č─▒ gibi;

Aral─▒klar─▒ ile kullan─▒labilir :

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

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

Regex ile kullan─▒labilir :

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

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

Procs ve Lambdas ile birlikte kullan─▒labilir :

 case 40
when -> (n) { n.to_s == "40" }
  puts "lambdas!"
end

## => "lambdas"
 

Ayr─▒ca, kendi e┼čle┼čme s─▒n─▒flar─▒n─▒zla da kullan─▒labilir:

 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
 

22







Yana switch case her zaman tek nesnesi d├Ând├╝ren, biz Sonu├žlar─▒n─▒ do─črudan yazd─▒rabilirsiniz:

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

21







├çok de─čerli ve de─čersiz durum:

 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
 

Ve burada d├╝zenli ifade ├ž├Âz├╝m├╝:

 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
 

20


2014-01-20





Vaka ifadelerini ruby'de iki farkl─▒ ┼čekilde yazabilirsiniz.

  1. Bir dizi "if" ifadesine benzer
  2. Davan─▒n yan─▒nda bir hedef belirleyin ve her "ne zaman" yan t├╝mcesi hedefle kar┼č─▒la┼čt─▒r─▒ld─▒.

1. yol

 age = 20
case 
when age >= 21
puts "display something"
when 1 == 0
puts "omg"
else
puts "default condition"
end
 

2. yol

  case params[:unknown]
 when /Something/ then 'Nothing'
 when /Something else/ then 'I dont know'
 end
 

12


2017-02-16





Bunu daha do─čal bir ┼čekilde yapabilirsin.

 case expression
when condtion1
   function
when condition2
   function
else
   function
end
 

10







├çok iyi cevaplar var ama bir tane factoid ekleyece─čimi d├╝┼č├╝nd├╝m.

─░┼čte http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/ konuyla ilgili iyi bir tart─▒┼čma. http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/


9







 puts "Recommend me a language to learn?"
input = gets.chomp.downcase.to_s

case input
when 'ruby'
    puts "Learn Ruby"
when 'python'
    puts "Learn Python"
when 'java'
    puts "Learn Java"
when 'php'
    puts "Learn PHP"
else
    "Go to Sleep!"
end
 

6







Yukar─▒daki cevaplar─▒n ├žo─čunda belirtildi─či gibi, === operat├Âr├╝ davayla / zaman ifadelerinde davlumbaz─▒n alt─▒nda kullan─▒l─▒r.

─░┼čte bu operat├Âr hakk─▒nda birka├ž ek bilgi.

Vaka e┼čitli─či operat├Âr├╝: ===

Ruby'nin String, Range ve Regexp gibi yerle┼čik s─▒n─▒flar─▒n─▒n bir├žo─ču, === operat├Âr├╝ne, durum e┼čitli─či, ├╝├žl├╝ e┼čit veya ├╝├žl├╝ olarak da bilinen uygulamalar─▒n─▒ sa─člar. Her s─▒n─▒fta farkl─▒ uyguland─▒─č─▒ i├žin, ├ža─čr─▒ld─▒─č─▒ nesne t├╝r├╝ne ba─čl─▒ olarak farkl─▒ davranacakt─▒r. Genel olarak, sa─čdaki nesne "sol" i├žindeki nesnenin bir ├╝yesiyse veya "├╝yesi" ise, true de─čerini d├Ând├╝r├╝r. ├ľrne─čin, bir nesnenin bir s─▒n─▒f─▒n (veya onun alt s─▒n─▒flar─▒ndan birinin) bir ├Ârne─či olup olmad─▒─č─▒n─▒ test etmek i├žin kullan─▒labilir.

 String === "zen"  # Output: => true
Range === (1..2)   # Output: => true
Array === [1,2,3]   # Output: => true
Integer === 2   # Output: => true
 

Ayn─▒ sonu├ž, is_a gibi i┼č i├žin muhtemelen en uygun ba┼čka y├Ântemlerle de elde edilebilir. ve example_of?

=== Menzil Uygulamas─▒

=== operat├Âr├╝ bir aral─▒k nesnesine ├ža─čr─▒ld─▒─č─▒nda, sa─čdaki de─čer soldaki aral─▒k i├žine d├╝┼čerse true de─čerini d├Ând├╝r├╝r.

 (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
 

=== operat├Âr├╝n├╝n soldaki nesnenin === y├Ântemini ├ža─č─▒rd─▒─č─▒n─▒ unutmay─▒n. Yani (1..4) === 3, (1..4) 'e e┼čittir. === 3. Ba┼čka bir deyi┼čle, sol i┼členenin s─▒n─▒f─▒, === y├Ânteminin hangi uygulamas─▒n─▒n uygulanaca─č─▒n─▒ tan─▒mlayacakt─▒r. denir, b├Âylece i┼členen konumlar birbirinin yerine ge├žemez.

Regexp === Uygulamas─▒

Sa─čdaki dize soldaki normal ifadeyle e┼čle┼čirse true de─čerini d├Ând├╝r├╝r. / zen / === "bug├╝n zazen al─▒┼čt─▒rmas─▒" # ├ç─▒kt─▒: => ger├žek #, "bug├╝n zazen al─▒┼čt─▒rmas─▒" ile ayn─▒d─▒r = = / zen /

Yukar─▒daki iki ├Ârnek aras─▒ndaki tek ilgili fark, e┼čle┼čme oldu─čunda === 'in do─čru oldu─čunu ve = ~' un bir tamsay─▒ d├Ând├╝rd├╝─č├╝, yani Ruby'de bir kabahat de─čeridir. Yak─▒nda buna geri d├Ânece─čiz.


6







 $age =  5
case $age
when 0 .. 2
   puts "baby"
when 3 .. 6
   puts "little child"
when 7 .. 12
   puts "child"
when 13 .. 18
   puts "youth"
else
   puts "adult"
end
 

reference => https://www.tutorialspoint.com/ruby/ruby_if_else.htm


3







Kullanmaya ba┼člad─▒m:

 a = "secondcase"

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

puts var_name
>> "bar"
 

Baz─▒ durumlarda kompakt kod yard─▒mc─▒ olur.


1







Ortam─▒n─▒zdaki normal ifadeler i├žin destek yok mu? ├ľrne─čin Shopify Komut Dosyas─▒ D├╝zenleyicisi (Nisan 2018):

[Hata]: ba┼člat─▒lmam─▒┼č sabit RegExp

Daha ├Ânce burada ve burada kapsanan y├Ântemlerin bir kombinasyonunu izleyen bir ge├žici ├ž├Âz├╝m :

 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
 

Ben or s metodunu || ├Ânceli─činden daha y├╝ksek oldu─čundan s─▒n─▒f y├Ântemi a├ž─▒klamas─▒nda kulland─▒m .include? . E─čer bir yakut nazi iseniz , l├╝tfen bunu kulland─▒─č─▒m─▒ d├╝┼č├╝n├╝n (item.include? 'A') || ... . repl.it testi.


1







Birden fazla ko┼čul i├žin switch ifadesini yazabiliriz.

├ľrne─čin,

 x = 22

CASE x
  WHEN 0..14 THEN puts "#{x} is less than 15"    
  WHEN 15 THEN puts "#{x} equals 15" 
  WHEN 15 THEN puts "#{x} equals 15" 
  WHEN 15..20 THEN puts "#{x} is greater than 15" 
  ELSE puts "Not in the range, value #{x} " 
END
 

1







Bir c├╝mlenin bir || bir if ifadesinin, yani, VEYA kar┼č─▒la┼čt─▒rmas─▒ yapar, when yan t├╝mcesinin ayr─▒lm─▒┼č ifadeleri aras─▒nda AND kar┼č─▒la┼čt─▒rmas─▒ olmaz. Bu y├╝zden a┼ča─č─▒daki dava a├ž─▒klamas─▒n─▒ kontrol edin. A├ž─▒k├žas─▒, x, 2'den daha az de─čildir, ancak geri d├Ân├╝┼č de─čeri 'elma'd─▒r. Niye ya? X 3 oldu─čundan ve ',' bir || gibi davrand─▒─č─▒ndan, 'x <2' ifadesini de─čerlendirmek zahmet etmedi.

 x = 3
case x
  when 3, x < 2 then 'apple'
  when 3, x > 2 then 'orange'
end
 => "apple"
 

Bir AND ger├žekle┼čtirmek i├žin a┼ča─č─▒daki gibi bir ┼čey yapabilece─činizi d├╝┼č├╝nebilirsiniz. Fakat i┼če yaram─▒yor. ├ç├╝nk├╝ (3 && x> 2) true olarak de─čerlendirir ve ruby ÔÇőÔÇőTrue de─čerini al─▒r ve x ile 3 oldu─ču i├žin === ile x'i kar┼č─▒la┼čt─▒r─▒r, ki bu a├ž─▒k├ža do─čru de─čildir.

 case x
  when (3 && x < 2) then 'apple'
  when (3 && x > 2) then 'orange'
end
 => nil 
 

Bir && kar┼č─▒la┼čt─▒rmas─▒ yapmak i├žin, a┼ča─č─▒daki gibi bir davay─▒ ele alman─▒z gerekir:

 case
  when x == 3 && x < 2 then 'apple'
  when x == 3 && x > 2 then 'orange'
end
 

Ruby Programlama Dili kitab─▒nda Matz, bu son formun basit (ve nadiren kullan─▒lan) form oldu─čunu s├Âyler, if / elsif / else i├žin alternatif bir s├Âzdiziminden ba┼čka bir ┼čey de─čildir. Ancak, nadiren kullan─▒l─▒p kullan─▒lmad─▒─č─▒na bak─▒lmaks─▒z─▒n, belirli bir 'ne zaman' c├╝mlesi i├žin birden fazla && ifadesi eklemenin ba┼čka bir yolunu g├Âremiyorum.


1