রুবিতে কীভাবে একটি সুইচ স্টেটমেন্ট লিখতে হয়


উত্তর:


2666

রুবি এর পরিবর্তে 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

অপারেটরটি ব্যবহার করে রুবি whenক্লজের আইটেমটির সাথে ক্লজটির সাথে তুলনা করে । উদাহরণস্বরূপ, এবং না ।case===1..5 === xx === 1..5

এটি whenউপরোক্ত হিসাবে পরিশীলিত ক্লজগুলির জন্য অনুমতি দেয় । সীমা, শ্রেণি এবং সমস্ত ধরণের জিনিস কেবল সাম্যতার চেয়ে পরীক্ষা করা যায়।

switchঅন্যান্য অনেক ভাষায় বিবৃতিগুলির বিপরীতে , রুবি'র পতনcase নেই , তাই এটিকে প্রতিটি দিয়ে শেষ করার দরকার নেই । আপনি একক ধারাতেও একাধিক ম্যাচ নির্দিষ্ট করতে পারেন ।whenbreakwhenwhen "foo", "bar"


12
আপনি পাস হওয়া যুক্তিতে রিজেক্সও করতে পারেন: কখন / thisisregex / পরের লাইন "এটি পাওয়া ম্যাচ এনআর। 1 # {$ 1}" শেষ
অটোমেটিকো

8
লক্ষণীয়, আপনি একই whenreturnwhen "foo" then "bar"
কোডটিতে

9
গুরুত্বপূর্ণ:switch অন্যান্য অনেক ভাষায় বিবৃতিগুলির বিপরীতে , রুবি'র পতনcase নেই , তাই এটিকে প্রতিটি দিয়ে শেষ করার দরকার নেই । whenbreak
জান্নিকস

3
এত বেশি ভোট এখনও কীওয়ার্ডের একটি উল্লেখও করে নি then। অন্যান্য উত্তরগুলি দেখুন।
ক্লিন্ট পাচল

442

case...whenক্লাস পরিচালনা করার সময় কিছুটা অপ্রত্যাশিতভাবে আচরণ করে। এটি ===অপারেটরটি ব্যবহার করে এমন কারণে ।

সেই অপারেটর আক্ষরিক সাথে প্রত্যাশার মতো কাজ করে তবে ক্লাসে নয়:

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

এর অর্থ হ'ল আপনি যদি 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 or number')
end

"এটি কোনও স্ট্রিং বা সংখ্যা নয়" মুদ্রণ করবে।

ভাগ্যক্রমে, এটি সহজেই সমাধান করা হয়। ===অপারেটর সংজ্ঞায়িত করা হয়েছে যাতে এটি ফেরৎ 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 or number')
end

আমি উত্তর খুঁজতে গিয়ে এই সমস্যাটি আজ আঘাত করেছি, এবং এটিই প্রথম প্রদর্শিত পৃষ্ঠা ছিল, তাই আমি বুঝতে পেরেছিলাম যে এটি আমার একই পরিস্থিতিতে অন্যদের পক্ষে কার্যকর হবে।


আপত্তি = 'হ্যালো'; কেস আপত্তি; যখন 'হ্যালো' তারপরে "এটি হ্যালো" শেষ হয়
সুগুমার ভেঙ্কটেসান

রয়ে .classঅংশগ্রহণ, ধন্যবাদ নোট আকর্ষণীয়। অবশ্যই, এটি সম্পূর্ণরূপে উপযুক্ত আচরণ (যদিও আমি দেখতে পেলাম যে এটি মুদ্রণ হবে এমন ভাবা সাধারণ ভুল হতে পারে It is a string) ... আপনি কিছু স্বেচ্ছাচারিত বস্তুর শ্রেণি পরীক্ষা করছেন , অবজেক্টটি নিজেই নয়। সুতরাং, উদাহরণস্বরূপ: case 'hello'.class when String then "String!" when Class then "Class!" else "Something else" endমধ্যে ফলাফল: "Class!"এই জন্য একই কাজ করে 1.class, {}.classইত্যাদি বাতিল .class, আমরা পেতে "String!"বা "Something else"এই বিভিন্ন মানের জন্য।
লিন্ডস

219

এটি caseরুবি ব্যবহার করে করা হয়। উইকিপিডিয়ায় " স্যুইচ স্টেটমেন্ট " দেখুন।

উদ্ধৃত:

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 পৃষ্ঠার উপরে, এতে বলা হয়েছে thenযে whenঅনুচ্ছেদের পরে থাকা মূল শব্দটিকে একটি নতুন লাইন বা সেমিকোলন ( if then elseসিনট্যাক্সের মতো) দিয়ে প্রতিস্থাপন করা যেতে পারে । (রুবি ১.৮ এছাড়াও এর পরিবর্তে একটি কোলনকে অনুমতি দেয় thenতবে রুবি ১.৯ এ এই সিনট্যাক্সের আর অনুমতি নেই))


38
when (-1.0/0.0)..-1 then "Epic fail"
অ্যান্ড্রু গ্রিম

এটি আমি উত্তরটি ব্যবহার করেছি, কারণ আমি কেস স্যুইচের ফলাফলের ভিত্তিতে একটি পরিবর্তনশীল সংজ্ঞায়িত করছি। type = #{score}প্রতিটি লাইন বলার চেয়ে , আপনি যা করেছেন তা আমি অনুলিপি করতে পারি। আরও মার্জিত আমি ওয়ান-
লাইনারগুলি

আমি জানি এটি উত্তরের সাথে সম্পর্কিত নয়, তবে 4 টিও একটি নিখুঁত বর্গক্ষেত্র।
নিক মুর

109

কেস ... যখন

চকের উত্তরে আরও উদাহরণ যুক্ত করতে :

পরামিতি সহ:

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

দয়া করে, " রুবিতে একটি স্যুইচ স্টেটমেন্ট কীভাবে লিখবেন " সম্পর্কে সচেতন হন যা কিকিতো সতর্ক করে দিয়েছে।


ধন্যবাদ, এক লাইনে একাধিক বিকল্প থাকার জন্য এটি সহায়ক ছিল। আমি ব্যবহার করার চেষ্টা করে or
যাচ্ছিলাম

73

অনেক প্রোগ্রামিং ভাষার, বিশেষ করে C থেকে উদ্ভূত, তথাকথিত জন্য সমর্থন আছে সুইচ Fallthrough । আমি রুবিতে এটি করার সবচেয়ে ভাল উপায়টি অনুসন্ধান করেছিলাম এবং ভেবেছিলাম এটি অন্যের পক্ষে উপযোগী হতে পারে:

সি-এর মতো ভাষায় পতনের কাজটি সাধারণত:

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

রুবিতে, নিম্নলিখিত পদ্ধতিতে এটি অর্জন করা যেতে পারে:

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'তবে বেশিরভাগ অংশে আমি এটি একইভাবে দরকারী হিসাবে যথেষ্ট বলে মনে করি।


72

রুবি ২.০-তে আপনি নীচে caseবিবৃতিতে ল্যাম্বডাস ব্যবহার করতে পারেন :

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

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

আপনি কাস্টম সহ স্ট্রাক্ট ব্যবহার করে সহজেই নিজের তুলনাকারী তৈরি করতে পারেন ===

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

(" রুবি ২.০-তে কেস স্টেটমেন্টের সাথে ব্যবহার করা যেতে পারে? " থেকে নেওয়া উদাহরণ )

বা, একটি সম্পূর্ণ ক্লাস সহ:

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

(" কীভাবে রুবি কেস স্টেটমেন্ট কাজ করে এবং আপনি এটি দিয়ে কী করতে পারেন " থেকে নেওয়া উদাহরণ ।)


52

আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন, যেমন স্ট্রিংয়ের একটি প্রকারের সন্ধান:

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

রুবি এর জন্য caseসাম্য অপারেন্ড ব্যবহার করবে ===(ধন্যবাদ @ জিমডিভিলি) অতিরিক্ত তথ্য " রুবি অপারেটর " এ উপলব্ধ । এটি @ মমিডেমিরবাস উদাহরণ হিসাবে (পরামিতি ছাড়াই) ব্যবহার করেও করা যেতে পারে, কেবল এই পদ্ধতির ক্ষেত্রেই এই ধরণের ক্ষেত্রে পরিষ্কার হয়।


34

আপনি যদি রুবি সুইচ মামলায় কীভাবে একটি ওআর শর্ত ব্যবহার করবেন তা জানতে আগ্রহী:

সুতরাং, একটি caseবিবৃতি, একটি ,সমতুল্য ||একটি ইন ifবিবৃতি।

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

" একটি রুবি কেস স্টেটমেন্ট কীভাবে কাজ করে এবং আপনি এটি দিয়ে কী করতে পারেন " দেখুন।


কোড ফর্ম্যাটিং লিঙ্কযুক্ত নিবন্ধে কাজ করছে না :-)
ফ্রোডেরিক

33

এটি বলা হয় caseএবং এটি আপনার প্রত্যাশা মতো কাজ করে, সাথে সাথে আরও অনেক মজাদার স্টাফ সৌজন্যে ===যা পরীক্ষাগুলি প্রয়োগ করে।

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

এখন কিছু মজার জন্য:

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

এবং এটি দেখা যাচ্ছে আপনি / অন্য শৃঙ্খলাটি (যেমন, পরীক্ষাগুলি একটি সাধারণ পরিবর্তনশীল জড়িত না হলেও) caseএছাড়াও প্রাথমিক caseপরামিতিটি ছেড়ে দিয়ে এবং প্রথম মিলটি যেখানে আপনি চান তা কেবল বাক্যগুলি লেখার মাধ্যমে প্রতিস্থাপন করতে পারেন।

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

23

রুবি caseসুইচ স্টেটমেন্ট লেখার জন্য ব্যবহার করে ।

অনুযায়ী caseডকুমেন্টেশন:

কেস স্টেটমেন্টগুলিতে একটি alচ্ছিক শর্ত থাকে যা caseশূন্য বা আরও বেশি whenধারাতে যুক্তির অবস্থানে থাকে । whenশর্তটির সাথে মেলে (বা বুলিয়ান সত্যের মূল্যায়ন করার জন্য, শর্তটি শূন্য হলে) "জিতেছে" এবং এর কোড স্তবনাটি কার্যকর করা হয়েছে The কেস স্টেটমেন্টের মান হ'ল সফল whenধারাটির মান , বা nilযদি এরকম কোনও ধারা নেই।

একটি মামলা বিবৃতি একটি elseধারা দিয়ে শেষ হতে পারে । প্রতিটি whenবিবৃতি কমা দ্বারা পৃথক, একাধিক প্রার্থী মান থাকতে পারে।

উদাহরণ:

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

সংক্ষিপ্ত সংস্করণ:

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

এবং যেমন " রুবির কেস স্টেটমেন্ট - অ্যাডভান্সড টেকনিকস " রুবিকে বর্ণনা করে case;

ব্যাপ্তিগুলির সাথে ব্যবহার করা যেতে পারে :

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

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

রেজেক্সের সাথে ব্যবহার করা যেতে পারে :

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

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

প্রকস এবং ল্যাম্বডাসের সাথে ব্যবহার করা যেতে পারে :

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

## => "lambdas"

এছাড়াও, আপনার নিজের ম্যাচের ক্লাসগুলির সাথে ব্যবহার করা যেতে পারে:

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

আপনার ক্ষেত্রে উপর নির্ভর করে, আপনি পদ্ধতিগুলির একটি হ্যাশ ব্যবহার করতে পছন্দ করতে পারেন।

যদি এর একটি দীর্ঘ তালিকা whenথাকে এবং তাদের প্রত্যেকের একটি (অন্তর অন্তর নয়) এর সাথে তুলনা করার একটি দৃ concrete় মান থাকে তবে পদ্ধতির একটি হ্যাশ ঘোষণা করা এবং তারপরে হ্যাশ থেকে প্রাসঙ্গিক পদ্ধতিটি কল করা আরও কার্যকর হবে।

# 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])

21

যেহেতু switch caseসর্বদা কোনও একক জিনিস ফেরত দেয়, আমরা সরাসরি এর ফলাফল মুদ্রণ করতে পারি:

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

20

মাল্টি-ভ্যালু যখন এবং নো-ভ্যালু কেস:

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

এবং এখানে একটি নিয়মিত অভিব্যক্তি সমাধান:

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

2
কেন শুধু নয় case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end(যেখানে ,নিউলাইন মানে)
ডোরকনব ২

2
ওহ, এবং প্রথম অংশটি ইতিমধ্যে এই উত্তরে কভার করা হয়েছে , এবং অনেক উত্তর ইতিমধ্যে রেজেক্স উল্লেখ করেছে। সত্যই, এই উত্তরটি নতুন কিছু যোগ করে না, এবং আমি এটি মুছে ফেলার পক্ষে ভোট দিচ্ছি এবং ভোট দিচ্ছি।
ডুরকনব

@ ডুরকনোবোফস্নো এটি দেখানোর জন্য যে আপনি স্যুইচ ক্ষেত্রে রেগেক্স সমাধান এবং কমা বিচ্ছিন্ন মানগুলি ব্যবহার করতে পারেন। সমাধান কেন আপনাকে এত ব্যথা দিচ্ছে তা নিশ্চিত নয়।
123

সুতরাং যদি তারা একটি "এফ", একটি আইনী গ্রেড পেয়ে থাকে তবে এটি তাদের দোষ কি আপনার কোডটি একটি কেস হারিয়েছে?
মাইক গ্রাফ

আমি এটির রসিকতা এবং এটি যে এটি প্রমাণ করে যে আপনি কোনও ক্ষেত্রে স্ট্রিং মেলতে পারেন।
এমেরি

13

আপনি caseরুবিতে দুটি ভিন্ন উপায়ে এক্সপ্রেশন লিখতে পারেন :

  1. ifবিবৃতি ধারাবাহিক অনুরূপ
  2. লক্ষ্যটির সাথে পরবর্তী লক্ষ্য নির্ধারণ করুন caseএবং প্রতিটি whenঅনুচ্ছেদে লক্ষ্যটির সাথে তুলনা করা হবে।
age = 20
case 
when age >= 21
puts "display something"
when 1 == 0
puts "omg"
else
puts "default condition"
end

বা:

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

যদিও আপনার কোডটি প্রশ্নের উত্তর দিতে পারে, আপনার কোডটি কী করে এবং এটি প্রাথমিক সমস্যাটি কীভাবে সমাধান করে তা সম্পর্কে আপনার কমপক্ষে একটি সংক্ষিপ্ত বিবরণ যুক্ত করা উচিত ।
ব্যবহারকারী 1438038

ভবিষ্যতে আমি এই পরামর্শটি বিবেচনা করব।
ইয়াস্ক

10

আপনি আরও প্রাকৃতিক উপায়ে এটি করতে পারেন,

case expression
when condtion1
   function
when condition2
   function
else
   function
end

9

প্রচুর দুর্দান্ত উত্তর কিন্তু আমি ভেবেছিলাম আমি একটি ফ্যাক্টয়েড যুক্ত করব .. আপনি যদি বস্তুগুলির (ক্লাস) তুলনা করার চেষ্টা করছেন তবে নিশ্চিত করুন যে আপনার কাছে কোনও স্পেস শিপ পদ্ধতি রয়েছে (কোনও রসিকতা নয়) বা কীভাবে তাদের তুলনা করা হচ্ছে তা বুঝতে পারেন

" রুবি ইক্যুয়ালিটি এবং অবজেক্টের তুলনা " বিষয়টিতে একটি ভাল আলোচনা is


7
রেফারেন্সের জন্য, "স্পেস শিপ" পদ্ধতিটি <=>, যা -1, 0, 1, বা শূন্যের তুলনায় যথাক্রমে কম, সমান, বৃহত্তর, বা তুলনীয় নয় কিনা তার উপর নির্ভর করে ফিরে আসে to রুবির তুলনাযোগ্য মডিউল ডকুমেন্টেশন এটি ব্যাখ্যা করে।
টিন ম্যান

7

উপরের অনেক উত্তরে যেমন বলা হয়েছে, ===অপারেটরটি case/ whenবিবৃতিগুলির ফণার নীচে ব্যবহৃত হয় ।

এখানে অপারেটর সম্পর্কে অতিরিক্ত তথ্য:

কেস সমতা অপারেটর: ===

স্ট্রিং, রেঞ্জ এবং রেজিএক্স্পের মতো রুবির অনেকগুলি বিল্ট-ইন ক্লাস ===অপারেটরের নিজস্ব বাস্তবায়ন সরবরাহ করে , "কেস- ইক্যুয়ালিটি ", "ট্রিপল ইকুয়াল" বা "থ্রিকুইয়াল" নামেও পরিচিত। যেহেতু এটি প্রতিটি শ্রেণিতে আলাদাভাবে প্রয়োগ করা হয়েছে, এটি যে ধরণের অবজেক্টের উপর ডাকা হয়েছিল তার উপর নির্ভর করে এটি আলাদা আচরণ করবে। সাধারণত, ডানদিকে থাকা অবজেক্টটি বাম দিকের অবজেক্টটির "অন্তর্গত" বা "সদস্য" হলে এটি সত্য হয়। উদাহরণস্বরূপ, এটি কোনও বস্তু শ্রেণীর উদাহরণ (বা এর উপ-শ্রেণীর একটি) কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে।

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

একই পদ্ধতিটি অন্যান্য পদ্ধতির সাথে অর্জন করা যেতে পারে যা সম্ভবত কাজের জন্য সবচেয়ে উপযুক্ত, যেমন is_a?এবংinstance_of?

ব্যাপ্তি বাস্তবায়ন ===

যখন ===অপারেটরটিকে একটি ব্যাপ্তি অবজেক্টে ডাকা হয়, ডানদিকে মান বামদিকে পরিসরের মধ্যে পড়ে তবে এটি সত্য হয়।

(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

মনে রাখবেন যে ===অপারেটর ===বাম-হাতের বস্তুর পদ্ধতিটি আহ্বান করে । সুতরাং (1..4) === 3সমতূল্য (1..4).=== 3। অন্য কথায়, বাম-হাতের অপারেন্ডের শ্রেণি নির্ধারণ করবে যে ===পদ্ধতিটির কোন বাস্তবায়ন বলা হবে, সুতরাং অপারেন্ড অবস্থানগুলি বিনিময়যোগ্য নয়।

এর Regexp বাস্তবায়ন ===

ডান দিকের স্ট্রিংটি বামে নিয়মিত প্রকাশের সাথে মিলে গেলে সত্যটি প্রত্যাবর্তন করে।

/zen/ === "practice zazen today"  # Output: => true
# is similar to
"practice zazen today"=~ /zen/

উপরোক্ত দুটি উদাহরণের মধ্যে কেবলমাত্র প্রাসঙ্গিক পার্থক্যটি হ'ল, যখন কোনও মিল হয়, ===সত্যটি =~প্রত্যাবর্তন করে এবং পূর্ণসংখ্যা ফেরত দেয় যা রুবিতে সত্যবাদী মান। আমরা শীঘ্রই এটিতে ফিরে পাবেন।


5
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

1
এটি কেন পছন্দের সমাধান এবং এটি কীভাবে কাজ করে তা ব্যাখ্যা করে যদি আপনি কোনও সরবরাহ সরবরাহ করেন তবে এটি আরও সহায়তা করে। আমরা কেবল কোড সরবরাহ না করেই শিক্ষিত করতে চাই।
টিন ম্যান


1

আমি ব্যবহার শুরু করেছি:

a = "secondcase"

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

puts var_name
>> "bar"

এটি কিছু ক্ষেত্রে কমপ্যাক্ট কোডকে সহায়তা করে।


1
এর মতো কোডটি সাধারণত Hashএকটি caseবিবৃতি না দিয়ে একটি ব্যবহার করে করা উচিত ।
টম লর্ড

যখন সুইচটি বড় হয়ে যায় তখন একটি হ্যাশ ব্যবহার করা আরও দ্রুত হবে।
টিন ম্যান

1

আপনার পরিবেশে নিয়মিত প্রকাশের জন্য কোনও সমর্থন নেই? যেমন শপাইফ স্ক্রিপ্ট সম্পাদক (এপ্রিল, 2018):

[ত্রুটি]: অবিচ্ছিন্ন ধ্রুবক RegExp

ইতিমধ্যে এখানে এবং এখানে ইতিমধ্যে আচ্ছাদিত পদ্ধতির সংমিশ্রনের পরে একটি কার্যবিধি :

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

আমি orক্লাস মেথড স্টেটমেন্টে এস ব্যবহার করেছি যেহেতু ||এর চেয়ে বেশি অগ্রাধিকার রয়েছে .include?। আপনি যদি রুবি-নাজি হন তবে অনুগ্রহ করে এর (item.include? 'A') || ...পরিবর্তে আমি এটি ব্যবহার করেছি । repl.it পরীক্ষা।


1

এটি ,একটি whenধারাতে কমা ( ) জোর দেওয়া সমালোচনা । এটি ||একটি ifবিবৃতি হিসাবে কাজ করে , অর্থাৎ এটি একটি ওআর তুলনা করে এবং ধারাটির সীমানা প্রকাশের মধ্যে একটি এবং তুলনা করে না when। নিম্নলিখিত কেস স্টেটমেন্ট দেখুন:

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

x2 এর চেয়ে কম নয়, তবুও ফেরতের মান "apple"। কেন? কারণ xছিল 3 এবং যখন থেকে ',`` acts as an|| , it did not bother to evaluate the expressionx <2 '

আপনি মনে করতে পারেন যে কোনও AND সম্পাদন করতে আপনি নীচের মতো কিছু করতে পারেন, তবে এটি কার্যকর হয় না:

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

কারণ কাজ করে না (3 && x > 2)সত্য মূল্যায়ণ এবং রুবি সত্য মান নেয় এবং তা তুলনা করে xদিয়ে ===, যা সত্য নয়, যেহেতু x3।

একটি &&তুলনা করতে, আপনাকে caseএকটি if/ elseব্লকের মতো আচরণ করতে হবে :

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

রুবি প্রোগ্রামিং ল্যাঙ্গুয়েজ বইয়ে, ম্যাটজ বলেছেন যে এই আধুনিক রূপটি সহজ (এবং প্রায়শই ব্যবহৃত হয়) ফর্ম, যা if/ elsif/ এর বিকল্প বিন্যাসের চেয়ে বেশি কিছু নয় else। তবে এটি প্রায়শই ব্যবহৃত হয় বা না হয়, &&প্রদত্ত whenধারাটির জন্য একাধিক অভিব্যক্তি সংযুক্ত করার আমি অন্য কোনও উপায় দেখতে পাচ্ছি না ।


এটি আমার কাছে ভাল কোডিং শৈলীর মতো মনে হয় না। বিরল বিকল্প সিনট্যাক্স ব্যবহার করা অযথা অবিচ্ছিন্ন হয়ে যায়। কেন সাধারণ ব্যবহার করবেন না if...elsif? দেখে মনে হচ্ছে আপনি কেস স্টেটমেন্ট এবং শর্ত মেশানোর চেষ্টা করছেন। কেন? কেবল শর্তসাপেক্ষে যখন ব্লকের ভিতরে রাখুন , যেমন। when 3; ( x < 2 ) ? 'apple' : 'orange'
sondra.kinsey

0

আমরা একাধিক শর্তের জন্য সুইচ স্টেটমেন্ট লিখতে পারি।

উদাহরণ স্বরূপ,

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
এটি কাজ করবে না; রুবি কীওয়ার্ড (যেমন। case, when, end) কেস সংবেদনশীল হয় এবং এই মত বড় হাতের হতে পারে না।
sondra.kinsey

NoMethodError (undefined method CASE 'প্রধানের জন্য: অবজেক্ট) `। @ Sondra.kinsey যেমনটি বলেছে, আপনি বড় হাতের অক্ষর ব্যবহার করতে পারবেন না। রুবি ভাবেন এটি একটি কনস্ট্যান্ট।
টিন ম্যান

0

caseবিবৃতি অপারেটর মত হল switchঅন্য ভাষায়।

এটি switch...caseসি এর বাক্য গঠন :

switch (expression)
​{
    case constant1:
      // statements
      break;
    case constant2:
      // statements
      break;
    .
    .
    .
    default:
      // default statements
}

এটি case...whenরুবির সিনট্যাক্স :

case expression
  when constant1, constant2 #Each when statement can have multiple candidate values, separated by commas.
     # statements 
     next # is like continue in other languages
  when constant3
     # statements 
     exit # exit is like break in other languages
  .
  .
  .
  else
     # statements
end

উদাহরণ স্বরূপ:

x = 10
case x
when 1,2,3
  puts "1, 2, or 3"
  exit
when 10
  puts "10" # it will stop here and execute that line
  exit # then it'll exit
else
  puts "Some other number"
end

আরও তথ্যের জন্য caseডকুমেন্টেশন দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.