রুবি শ্রেণির ধরণ এবং কেস স্টেটমেন্ট


135

পার্থক্য কি

case item.class
when MyClass
  # do something here
when Array
  # do something different here
when String
  # do a third thing
end

এবং

case item.class
when MyClass.class
  # do something here
when Array.class
  # do something different here
when String.class
  # do a third thing
end

কোনও কারণে, এর মধ্যে প্রথমটির মধ্যে একটি কখনও কখনও কাজ করে এবং দ্বিতীয়টি করে না এবং অন্যান্য সময়, দ্বিতীয়টি কাজ করে এবং প্রথমটি কাজ করে না। কেন? কোনটি এটির "যথাযথ" উপায়?


1
স্ট্রিং একটি ক্লাস। ক্লাসের ক্লাস হ'ল ক্লাস।
ভোল্ট

লক্ষ্য করুন MyClass === objব্যবহার মডিউল # === যদি চেক করতে পদ্ধতি objএকটি দৃষ্টান্ত হল MyClass
সার্জিও

উত্তর:


234

আপনি অবশ্যই ব্যবহার করুন:

case item
when MyClass
...

আমারও একই সমস্যা ছিল: এর্ননো :: কীভাবে "কেস" ক্ষেত্রে একনরসেট ক্লাস ধরব?


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

4
অ্যাক্টিভেকর্ড ব্যবহার করা হলে একটি ক্যাভিয়েট উল্লেখ করা হয়নি। অ্যাক্টিভেকর্ড === শ্রেণীর তুলনাতে পদ্ধতি .is_a? ব্যবহার করে, যার অর্থ একটি শ্রেণীর সাবক্লাসগুলি কেস স্টেটমেন্টে সত্য হিসাবে মূল্যায়ন করবে। github.com/rails/rails/blob/…
জেরেমি বাকের

60

হ্যাঁ, নাকিলন সঠিক, আপনাকে অবশ্যই জানতে হবে কীভাবে ক্লজটিতে প্রদত্ত বস্তুটিতে থ্রি কোয়াল === অপারেটর কাজ করে when। রুবিতে

case item
when MyClass
...
when Array
...
when String
...

সত্যি

if MyClass === item
...
elsif Array === item
...
elsif String === item
...

বুঝুন যে কেসটি একটি ত্রি-ত্বক পদ্ধতিতে কল করছে ( MyClass.===(item)উদাহরণস্বরূপ), এবং সেই পদ্ধতিটি আপনি যা চান তা করার জন্য সংজ্ঞায়িত করা যেতে পারে এবং তারপরে আপনি কেস স্টেটমেন্টটি নির্ভুলতার সাথে ব্যবহার করতে পারবেন


আমি যদি arr = []তখন দেখেছি যে if Array === arrএটি সত্যকে if arr === Arrayমূল্যায়ন করবে তবে মিথ্যাতে মূল্যায়ন করবে। কেউ দয়া করে ব্যাখ্যা করতে সাহায্য করতে পারেন?
ড্যানিয়েল

4
=== হ'ল একটি পদ্ধতি যা কোনও শ্রেণীর ডিজাইনার যা করতে চায় তা করতে সংজ্ঞায়িত হতে পারে। এও মনে রাখবেন যে, a === b এর প্রকৃত অর্থ a। === b, সুতরাং আপনি যদি একটি এবং বি স্যুইচ করেন তবে আপনি আলাদা আচরণ পেতে পারেন। কোনও গ্যারান্টি নেই যে === পরিবর্তনমূলক। আসলে অ্যারে === অ্যারেটি মিথ্যা, তবে অবজেক্ট === অবজেক্টটি সত্য, সুতরাং অ্যারে === এর শব্দার্থকে নতুনভাবে সংজ্ঞায়িত করছে।
ফ্রেড

13

তুমি ব্যবহার করতে পার:

case item.class.to_s
    when 'MyClass'

... যখন নিম্নলিখিত বাঁকটি সম্ভব হয় না:

case item
    when MyClass

এর কারণ হ'ল এটি caseব্যবহার করে ===এবং অপারেটর যে সম্পর্কটি ===বর্ণনা করেছেন তা পরিবর্তনীয় নয় । উদাহরণস্বরূপ, 5একটি Integer, তবে Integerএকটি 5? এইভাবে আপনার case/ সম্পর্কে চিন্তা করা উচিত when


5

রুবিতে, একটি শ্রেণীর নাম একটি ধ্রুবক যা Classনির্দিষ্ট শ্রেণীর বর্ণনা দেয় এমন কোনও ধরণের অবজেক্টকে বোঝায় । তার অর্থ MyClassরুবিতে বলা MyClass.classজাভাতে বলা সমান ।

obj.classClassশ্রেণীর বর্ণনা দেয় এমন একটি বস্তু obj। যদি obj.classহয় MyClassতবে objতা তৈরি করে তৈরি হয়েছিল MyClass.new(মোটামুটি কথা বলা)। MyClassপ্রকারের একটি অবজেক্ট Classযা ব্যবহার করে তৈরি যে কোনও বস্তুর বর্ণনা করে MyClass.new

MyClass.classMyClassঅবজেক্টের শ্রেণি (এটি টাইপের অবজেক্টের শ্রেণিClass যা ব্যবহার করে তৈরি যে কোনও অবজেক্টকে বর্ণনা করে MyClass.new)। অন্য কথায় MyClass.class == Class,।


1

এটি আপনার itemপরিবর্তনশীলের প্রকৃতির উপর নির্ভর করে । যদি এটি কোনও বস্তুর উদাহরণস্বরূপ হয়

t = 5

তারপর

t.class == Fixnum

তবে এটি যদি নিজের মধ্যে একটি বর্গ হয় যেমন

t = Array

তাহলে এটি একটি Classবস্তু হবে, তাই

t.class == Class

সম্পাদনা : অনুগ্রহ করে কীভাবে এর্ননোকে ধরবেন :: "কখন" ক্ষেত্রে একনরসেট ক্লাস? আমার উত্তর ভুল হতে পারে যেহেতু নাকিলন বলেছিলেন


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