প্রতিটি 'যখন' ব্লক করে একাধিক মান সহ কেস স্টেটমেন্ট


314

আমি যা খুঁজছি তার বর্ণনা দেওয়ার সবচেয়ে ভাল উপায় হ'ল আমি এতদূর চেষ্টা করেছি এমন ব্যর্থ কোডটি আপনাকে দেখানো:

case car
  when ['honda', 'acura'].include?(car)
    # code
  when 'toyota' || 'lexus'
    # code
end

আমি প্রায় 4 বা 5 বিভিন্ন whenপরিস্থিতি পেয়েছি যা প্রায় 50 টি বিভিন্ন সম্ভাব্য মানের দ্বারা ট্রিগার করা উচিত carcaseব্লকগুলির সাথে এটি করার কোনও উপায় আছে বা আমার একটি বিশাল ifব্লক চেষ্টা করা উচিত ?

উত্তর:


669

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

case car
   when 'toyota', 'lexus'
      # code
end

রুবি কেস স্টেটমেন্ট দিয়ে আপনি অন্যান্য কিছু করতে পারেন things


1
এই লিঙ্কটিতে রুবিতে কেস স্টেটমেন্টের আরও ভাল সংক্ষিপ্তসার রয়েছে (এবং এতে রেজিএক্সএক্সপ এবং স্প্ল্যাট সিনট্যাক্সের উদাহরণও রয়েছে)।
rsenna

আমি কেন জানি না, কিন্তু এই অদ্ভুত অবস্থা ঘটবে: যখন আমি এই লিখুন: when "toyota", "lexus"আমি পাবেন: unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)। যাইহোক, আমি যখন when "toyota","lexus"এটি লিখি :, এটি কার্যকর হয়। পার্থক্য হ'ল কমা পরে একটি স্থান।
ফুরকান আয়ান

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

1
ঠিক আছে, এটি কাজ করে, তবে প্রোগ্রামারের স্বাচ্ছন্দ্যে রুবি ফোকাস হিসাবে, আমি কেন আশ্চর্যের কারণ না এটি স্ট্যান্ডার্ডকে সমর্থন করে || বা বা'? এটি এক ধরণের বিভ্রান্তিকর
জিয়া উল রেহমান মোগল

2
রুবি সমর্থন করে না orবা ||এখানে কারণ এটি whenকোনও একক সনাক্তকারী নয়, ডানদিকে কমা-বিচ্ছিন্ন অভিব্যক্তিগুলির একটি সিরিজ নিয়ে যায়। এর কারণে, যদি আপনার কাছে থাকে তবে when a or bএটি স্পষ্ট নয় যে এটি কখন এর মধ্যে ফেলে দেওয়ার আগে প্রথমে অভিব্যক্তিটির মূল্যায়ন করে when a, bবা এর সমতুল্য হিসাবে নেওয়া হবে কিনা । ভাষার প্রসঙ্গের ভিত্তিতে আচরণ পরিবর্তন করে এমন টোকেন রাখার জন্য ভাষাটি হ'ল আরও আশ্চর্যজনক এবং কম সহজ এবং এরপরে আপনি কখনই ডান দিকে একটি বাস্তব প্রকাশ করতে সক্ষম হবেন না । when (a or b)a or bor
তাইউই

99

আপনি রুবির "স্প্ল্যাট" বা চ্যাপ্টা সিনট্যাক্সের সুবিধা নিতে পারেন।

এটি ওভারগ্রাউন্ড whenক্লজগুলি তৈরি করে - যদি আমি সঠিকভাবে বুঝতে পারি তবে প্রতিটি শাখায় পরীক্ষা করার জন্য আপনার কাছে 10 টি মান রয়েছে - আমার মতে আরও কিছুটা পাঠযোগ্য। অতিরিক্তভাবে, আপনি রানটাইমে পরীক্ষার মানগুলি সংশোধন করতে পারেন। উদাহরণ স্বরূপ:

honda  = ['honda', 'acura', 'civic', 'element', 'fit', ...]
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...]
...

if include_concept_cars
  honda += ['ev-ster', 'concept c', 'concept s', ...]
  ...
end

case car
when *toyota
  # Do something for Toyota cars
when *honda
  # Do something for Honda cars
...
end

আর একটি সাধারণ পদ্ধতি হ্যাশকে প্রেরণ টেবিল হিসাবে ব্যবহার করা হবে, প্রতিটি মান carএবং মানগুলির কীগুলি সহ যেগুলি আপনাকে সম্পাদন করতে চান এমন কোডকে আবশ্যক এমন কিছু কলযোগ্য বস্তু।


এটিই আমি ব্যবহার করে শেষ করেছি, যদিও কারও চেক চিহ্নটি নিয়ে যেতে আমার খারাপ লাগছে: ডি
নিক

দীর্ঘ whenলাইনের জন্য উজ্জ্বল সমাধান । ভাগ করে নেওয়ার জন্য ধন্যবাদ.
পিস্তোস

0

ডেটাতে আপনার যুক্তি যুক্ত করার আর একটি দুর্দান্ত উপায় হ'ল:

# Initialization.
CAR_TYPES = {
  foo_type: ['honda', 'acura', 'mercedes'],
  bar_type: ['toyota', 'lexus']
  # More...
}
@type_for_name = {}
CAR_TYPES.each { |type, names| names.each { |name| @type_for_name[type] = name } }

case @type_for_name[car]
when :foo_type
  # do foo things
when :bar_type
  # do bar things
end

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

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

YAGNI ("আপনার প্রয়োজন হবে না") এখানে আবেদন করতে পারে। এই নকশাটি এমন একটি দৃশ্যের জন্য সময় / স্থান দক্ষতা এবং পাঠযোগ্যতার ত্যাগ করে যা ভবিষ্যতে উপস্থিত হতে পারে তবে এখনও বিদ্যমান নেই। এখনই মূল্য দেওয়া হয়েছে, তবে পুরষ্কারটি কখনও কাটা যাবে না।
নিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.