Ruby'də keçid ifadəsini necə yazmaq olar?

Ruby'də keçid ifadəsini necə yazmaq olar?

1897
04 июня '09 в 4:18 2009-06-04 04:18 Oxunuşda 04 İyun '09 'da saat 04:18 ' da, 2009-06-04 04:18
@ 22 cavab

Bunun əvəzinə, Ruby bir case ifadəsini istifadə edir.

 case x when 1..5 "It between 1 and 5" when 6 "It 6" when "foo", "bar" "It 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, obyektin === operatoru istifadə edən bir bənddə bir maddə olan when bir obyekti müqayisə edir. Məsələn, 1..5 === x , x === 1..5 .

Bu, yuxarıda göstərildiyi kimi, maddələr when kompleks imkan verir. Aralar, siniflər və hər cür şeylər yalnız bərabərlik deyil, yoxlanıla bilər.

Bir çox digər dildə switch fərqli olaraq, Rubys case bir düşmə yoxdur, buna görə hər bir break ilə bitirmək lazım deyil. when "foo", "bar" kimi bənddə olduğu kimi, birdən çox matçı da göstərə bilərsiniz.

2408
04 июня '09 в 4:22 2009-06-04 04:22 Cavab Chuck tərəfindən 04 İyun 04 'da 4:22' də verildi. 2009-06-04 04:22

case...when dərsləri emal edərkən bir az gözlənilmədən davranır. Bu, === operatoru istifadə etməsi ilə bağlıdır.

Bu operator litals ilə gözlənildiyi kimi işləyir, lakin siniflərlə deyil:

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

Bu, bir case ... when etmək istəyirsinizsə case ... when bir obyekt sinifində case ... when işləməyəcəkdir:

 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 

"Bu bir simli deyil" yazdırılacaq.

border=0

Xoşbəxtlikdən, bu həll etmək asandır. === Operator bir siniflə istifadə edirsinizsə, bu true qaytarmaq üçün müəyyən olunmuşdur və ikinci bir operand kimi bu sinifin nümunəsini qoyursunuz:

 Fixnum === 1 # => true 

Bir sözlə, yuxarıda göstərilən kodu silməklə aradan qaldırıla bilər .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 

Bu gün mən bu problemə qaçıb bir cavab axtarırdım və bu görünən ilk səhifə idi, buna görə mən öz vəziyyətimdə başqalar üçün faydalı olardı.

404
17 апр. Cavab verilir kikito 17 Aprel. 2011-04-17 18:20 '11 saat 18:20 'da 2011-04-17 18:20

Bu ruby vəziyyətdə edilir. Bu vikipediya məqaləsinə baxın .

Sitat:

 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 

Digər bir nümunə:

 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'də (I Kindle istifadə edirəm) (1-ci Edition, O'Reilly) sözügedən vaxtdakı sözün yeni bir satırla və ya nöqtəli verilmiş əvəz edilə biləcəyini deyir ). (Ruby 1.8, eyni zamanda bir kolonuna da imkan verir ... Lakin bu sözdizimi artıq Ruby 1.9'da icazə verilmir.)

193
04 июня '09 в 4:20 2009-06-04 04:20 Cavab verilir 太極 者 無極 而 生 04 İyun '09 4:20 2009-06-04 04:20

halda ... zaman

Chuck cavabına daha çox nümunə əlavə etmək üçün:

Parametr ilə

 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 

Parametr 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 

Xahiş edirik kikitonun xəbərdar etdiyi problemi xatırlayın.

89
05 июля '12 в 16:19 2012-07-05 16:19 cavab mmdemirbas tərəfindən verilir 05 iyul '13 saat 16:19 'da 2012-07-05 16:19

Bir çox proqramlaşdırma dilləri, xüsusilə də C-dən istehsal olunan, sözdə Patch-Switch keçidini dəstəkləyir . Ruby'də eyni şeyi etmək üçün daha yaxşı bir yol axtarırdı və başqalarına faydalı ola biləcəyini düşünürdüm:

C-kimi dillərdə, uğursuzluq adətən belədir:

67
07 дек. Robert Kajic tərəfindən verilmiş cavab 07 Dek 2013-12-07 15:11 '13 at 15:11 2013-12-07 15:11

Ruby 2.0-də, aşağıda göstərildiyi kimi, case lambdaları da istifadə edə bilərsiniz:

 is_even = ->(x) { x % 2 == 0 } case number when 0 then puts 'zero' when is_even then puts 'even' else puts 'odd' end 

Custom === ilə Struct istifadə edərək, öz müqayisə etmenizi asanlıqla da yarada bilərsiniz

 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-də ifadələrlə istifadə edə bilərlər . ").

Və ya tam siniflə:

 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 

(Nümunə ifadəsinin necə işlədiyindən və bununla nə edə biləcəyinizdən nümunə).

65
01 авг. Cavab James Lim 01 Avqustda. 2013-08-01 03:04 '13 'da 3:04' de 2013-08-01 03:04

Bir simli növü axtarma kimi müntəzəm ifadələrdən istifadə edə bilərsiniz:

 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 bu üçün bərabərlik operand === istifadə edəcək (təşəkkür @ JimDeville). Daha ətraflı məlumatı Ruby operatorlarında tapa bilərsiniz. Bu da @mdemirbas nümunəsi (parametr olmadan) istifadə edilə bilər, yalnız bu yanaşma bu cür hallarda daha aydındır.

49
16 окт. Cavab 16 oktyabrda Haris Krajina tərəfindən verilir . 2012-10-16 15:17 '12 at 15:17 2012-10-16 15:17

Bir Ruby keçid vəziyyətində vəziyyətdən necə istifadə edəcəyini bilmək istəyirsinizsə:

Beləliklə, bu case bir ifadəsi || if ifadəsində.

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

Ruby iddiası ilə bir çox başqa şeylər edə bilərsiniz

30
03 июля '14 в 9:46 2014-07-03 09:46 Cavab Maniş Shrivastava tərəfindən 03 iyul '14 saat 09:46 'da verilir 2014-07-03 09:46

Bu case deyilir və gözlənildiyi kimi işləyir və testlər aparan bir çox maraqlı, nəzakətli bir şəkildə === verilir.

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

İndi bəzi əyləncə üçün:

 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 

Və belə çıxır ki, əgər siz də özbaşına if / else zəncirinin (yəni, testlərdə ümumi dəyişkənliyi də daxil etməsə də) əsl case parametrini tərk edərək sadəcə ilk matçın istədiyinin olduğu ifadələri yazmaqla əvəz edə bilərsiniz.

 case when x.nil? ... when (x.match /'^fn'/) ... when (x.include? 'substring') ... when x.gsub('o', 'z') == 'fnzrq' ... when Time.now.tuesday? ... end 
25
05 февр. Cavab DigitalRoss 05 fevralda verilir. 2016-02-05 23:40 '16 'da saat 11:40' də 2016-02-05 23:40 'də

Vəziyyətinizə bağlı olaraq, hash üsullarını istifadə etməyi üstün edə bilərsiniz.

Uzun bir siyahı varsa, hər biri müqayisə üçün xüsusi bir dəyərə malik olduqda (intervalın əvəzinə) metodların haşını bildirmək daha səmərəli olacaq və daha sonra məsələn, hashdən uyğun üsul çağırır, məsələn, nə.

 # 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 say we case by selected_menu = :a selected_menu = :a # Then just call the relevant method from the hash send(menu[selected_menu]) 
20
18 сент. Cavab 18 sentyabrda İskəndərə verildi . 2014-09-18 17:48 '14 da 5:48 pm 2014-09-18 17:48

switch case həmişə tək bir obyektə çevrildikdən sonra, nəticəsini birbaşa çap edə bilərik:

 puts case a when 0 "It zero" when 1 "It one" end 
19
05 нояб. Cavab Sonu Oommen verilir 05 Noyabr. 2013-11-05 10:29 '13, saat 10:29 'da 2013-11-05 10:29

Bir çox halda və əgər dəyərsizdirsə:

 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 

müntəzəm ifadə :

 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 
19
20 янв. Cavab 123 20 yanvar verilir . 2014-01-20 14:45 '14 saat 14:45 'də 2014-01-20 14:45

Ruby keçid ifadələrini yazmaq üçün case istifadə case .

Ruby Sənədlərinə görə:

Vəsa ifadələr, case ardıcıllığı mövqeyində olan və maddələr when sıfır və ya daha çox olan bir isteğe bağlı vəziyyətdən ibarətdir. Vəziyyəti uyğun tutan when (və ya vəziyyəti null halda Boolean doğru qiymətləndirmək üçün) ilk when qazanır və onun kod lentası yerinə yetirilir. Davanın arqumentinin dəyəri, belə bir maddə olmadığında, müvəqqəti və ya nil bəndin dəyəridir.

İddia bəyanatı else bənddə sona çatdıra bilər. Hər bir bəyanatda birdən çox namizəd dəyər ola bilər, virgülle ayrılır.

Məsələn:

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

Qısa versiyası:

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

Və bu Honeybadger blog Ruby Case təsvir necə;

Aralıqlarla istifadə edilə bilər:

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

Regex ilə istifadə edilə bilər:

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

Procs və Lambdas ilə istifadə edilə bilər:

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

Bundan əlavə, öz təsadüfi sinifləri ilə də istifadə edilə bilər:

 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 
17
18 июля '16 в 22:59 2016-07-18 22:59 Cavab Lahiru 18 iyul '16 saat 10:59 'da verilir. 2016-07-18 22:59

Ruby'də iki halda yol ifadələri yaza bilərsiniz.

  • Bir sıra "if" ifadələri kimi
  • Kabuğun yanında bir hədəf seçin və hər bir "zaman" sözü hədəflə müqayisə edilir.

1-ci üsul

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

İkinci yol

  case params[:unknown] when /Something/ then 'Nothing' when /Something else/ then 'I dont know' end 
11
16 февр. Cavab 16 fevralda verilir . 2017-02-16 12:32 '17 də 12:32 'də 2017-02-16 12:32' də

Bunu daha təbii bir şəkildə edə bilərsiniz

 case expression when condtion1 function when condition2 function else function end 
8
26 мая '16 в 12:15 2016-05-26 12:15 cavab May 26, '16, 12:15 2016-05-26 12:15 'də verilir

Çox əla cavablar, amma bir fakt əlavə edəcəyəm. Obyektləri (sinifləri) müqayisə etmək üçün çalışırıqsa, bir kosmik üsulu olduğundan əmin olun (bir zarafat deyil) və ya necə müqayisə olunduğunu anlayın.

Burada http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/ mövzusunda yaxşı bir müzakirə var.

8
06 авг. Cavab verilən jmansurf 06 Avqust 2013-08-06 23:18 '13 at 23:18 2013-08-06 23:18
 puts "Recommend me a > 
5
12 марта '16 в 9:33 2016-03-12 09:33 Cavab Prabhakar tərəfindən 12 mart '16, 9:33 2016-03-12 09:33 'də verilir

Yuxarıda göstərilən cavabların bir çoxunda qeyd olunduğu kimi, === operator operatorun işi üzrə başlıq altında istifadə olunur.

Bu bəyanatla əlaqədar bəzi əlavə məlumatlar var.

Case bərabərliyi operatoru: ===

String, Range və Regexp kimi daxili Ruby siniflərindən bir çoxu, eyni zamanda, bərabər, üçlü bərabər və üçqual kimi tanınan öz === operator tətbiqlərini təmin edir. Hər sinifdə fərqli şəkildə tətbiq olunduğundan, o, adlandırılan obyektin növündən asılı olaraq fərqlənir. Sağdakı obyekt "sol" olan obyektin "aiddir" və ya "bir üzvü" olduqda, tipik olaraq doğru olur. Məsələn, bir obyektin bir sinifin nümunəsi olub-olmadığını yoxlamaq üçün istifadə edə bilərsiniz (ya da onun alt siniflərindən biri).

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

Eyni nəticə, yəqin ki, iş üçün uyğun olan digər metodlardan istifadə edilə bilər, məsələn, is_a? və instance_of?

İmplant aralığı ===

=== Operator bir sıra obyektdə çağırıldığında, sağdakı dəyər solda aralığında olduqda doğru olur.

 (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 

=== Operatorun sol obyekt üçün === üsulunu çağırdığını unutmayın. Beləliklə, (1..4) === 3 (1..4) ilə bərabərdir. Digər bir deyişlə, sol operandın sinfi === əməliyyatın tətbiqinin operandın mövqeləri bir-birinin ardınca gəlməyəcəyini təyin edəcəkdir.

Yeniləmə Regexp ===

Sağdakı xətt solda olan müntəzəm ifadəyə uyğun gəlsə düzgün olur. = zen / === "Zazen bugün praktik" # Sonuç: => true # "Zazen Practice Practice" = ~ / zen /

Yuxarıdakı iki nümunə arasındakı ən uyğun fərq, bir matç olduğunda, === doğru qaytarır və = ~ Ruby'də əsl dəyər olan bir tamsayı qaytarır. Tezliklə qayıdacağıq.

4
06 июля '16 в 19:07 2016-07-06 19:07 Cavab BrunoFacca tərəfindən verilir 06 iyul '19 saat 19:07 2016-07-06 19:07
 $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 

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

2
13 нояб. cavab Navneet 13 noyabrda verilir . 2017-11-13 10:58 '17 saat 10:58 'da 2017-11-13 10:58' a qədər

Ətrafınızda müntəzəm ifadə dəstəyi yoxdur? Məsələn, Shopify Script Editor (Aprel 2018):

[Səhv]: təkrarlanmayan sabit RegExp

Daha əvvəl buradaburada təsvir edilmiş metodların birləşməsindən sonra həll prosesi:

 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 

Çünki istifadə etdiyim or sinif metodu ifadəsindəki ' || daha .include? . Ruby-nazi , mən bunu istifadə etdiyini təsəvvür edin (item.include? 'A') || ... (item.include? 'A') || ... repl.it testi.

1
18 апр. Cavab 18 apreldə CPHPython tərəfindən verilir . 2018-04-18 14:29 '18 də 2:29 'də 2018-04-18 14:29

Istifadə etməyə başladım:

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

Bəzi hallarda, kompakt koda kömək edir.

1
08 июля '14 в 0:18 2014-07-08 00:18 Cavab deepfritz 08 iyul 2014 tarixində 0:18 2014-07-08 00:18 tarixində verilir

Bir neçə şərt üçün bir keçid bəyanatı yaza bilərik.

Məsələn,

 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
25 янв. Cavab Foram Thakral tərəfindən verilir. 25 yanvar. 2019-01-25 10:32 '19 da 10:32 'də 2019-01-25 10:32

bağlı digər suallar və ya sual verin