রুবি শ্রেণি অন্য শ্রেণীর একটি সাবক্লাস কিনা তা পরীক্ষা করুন


187

আমি পরীক্ষা করতে চাই যে কোনও শ্রেণি অন্য শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে এসেছে, তবে এর জন্য কোনও পদ্ধতি বিদ্যমান বলে মনে হয় না।

class A
end

class B < A
end

B.is_a? A 
=> false

B.superclass == A
=> true

আমি যা চাই তার একটি তুচ্ছ বাস্তবায়ন হ'ল:

class Class
  def is_subclass_of?(clazz)
    return true if superclass == clazz
    return false if self == Object
    superclass.is_subclass_of?(clazz)
  end
end

তবে আমি আশা করব এটি ইতিমধ্যে বিদ্যমান থাকবে।


2
A.class #=> Class। এই কারণেই B.is_a? Aমিথ্যা প্রত্যাবর্তন করে।
ওয়েন

কি সম্পর্কেkind_of?
akostadinov

1
kind_of?কোনও বস্তু একটি শ্রেণীর উদাহরণ কিনা তা পরীক্ষা করে । বস্তুটি ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত কিনা।
বিভ্রান্তি

5
kind_of?2is_a?
08-

উত্তর:


355

শুধু <অপারেটর ব্যবহার করুন

B < A # => true
A < A # => false

বা <=অপারেটর ব্যবহার করুন

B <= A # => true
A <= A # => true

13
@ ব্রায়ান কারণ is_a?অনুবাদ উদাহরণস্বরূপBএর উদাহরণ নয় A, B.newযদিও ( B.new.is_a? A # => true)।
মার্সেল জ্যাকওয়ার্থ

4
হুম, অদ্ভুত সিনট্যাক্স (আমার প্রথম অনুমানটি হত না) তবে স্পষ্টতার জন্য ধন্যবাদ!
ব্রায়ান আর্মস্ট্রং


2
রুবির সাথে আমার প্রেম / ঘৃণার সম্পর্ক অব্যাহত রয়েছে ... শ্রেণি সম্পর্ক ঘোষণার জন্য ব্যবহৃত অপারেটরের জন্য কেন একটি পৃথক ফাংশন সরবরাহ করা এবং এটি করার দুটি ভিন্ন উপায় সরবরাহ করা কেন?
বেন গোটো

4
@ বেনগোট - ১. কারণ <অপারেটর নয়, এটি একটি পদ্ধতি। ২. কারণ <কেবল একটি সাবক্লাসের জন্য পরীক্ষা করে, এবং <= এ স্ব অন্তর্ভুক্ত করে।
সুপারলুমিনিয়ার

59

এটাও আছে:

B.ancestors.include? A

এটি অন্তর্ভুক্ত করা হয়েছে B < Aকারণ এর (সংক্ষিপ্ত) উত্তর থেকে কিছুটা পৃথক :BB.ancestors

B.ancestors
#=> [B, A, Object, Kernel, BasicObject]

B < B
#=> false

B.ancestors.include? B
#=> true

এটি কাঙ্ক্ষিত কিনা তা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে।


24
আরও পঠনযোগ্য: B <= B(একই ফলাফল B.ancestors.include? B)।
মার্সেল জ্যাকওয়ার্থ

আপডেট: তত্ক্ষণাত্ পূর্ববর্তী সমাধানটি 1.9+ দিয়ে কাজ করে যেখানে কোনও "পূর্বপুরুষ" নেই? 1.9 এ।

8
এটি '<' সিনট্যাক্সের সাথে পরিচিত না এমন লোককে বিভ্রান্ত করবে না এবং সেই কারণেই আমি এটি পছন্দ করি।
আসফান্দ কাজী

2
@ সিমোনলিপকিন সম্ভবত "কিছুক্ষণ" নয়, যদি না আপনি মাইক্রোসেকেন্ডগুলি টিক টিকিয়ে রাখতে পারেন। ;) হ্যাঁ, পর্দার আড়ালে পূর্বপুরুষের চেইনের মধ্য দিয়ে দৃশ্যগুলি include?এবং <পদ্ধতিগুলি লুপ হয় । এটি সিতে এটি করে, অবশ্যই রুবি অ্যারের মাধ্যমে লুপিংয়ের চেয়ে দ্রুত ... তবে কার্যত দু'জনকে পৃথক করা উচিত।
ফ্রেগজ

1
@ জুনানচাকমা ইংরেজি শব্দ "পূর্বপুরুষ" কীভাবে সংজ্ঞায়িত হয়েছে তার উপর ভিত্তি করে আমি সম্মত হই যে রিটার্ন মানটি অন্তর্ভুক্ত করা উচিত নয় B। তবে তা করে। পদ্ধতি ডকুমেন্টেশন বলছেন, "রিটার্নস মডিউল একটি তালিকা অন্তর্ভুক্ত / (মুডে prepended নিজেই গেলিক ভাষার সহ )।" (জোর আমার)। আমি অনুমান করছি এটি ব্যবহার করার সময় সুবিধার জন্য এটির নিজস্ব শ্রেণি অন্তর্ভুক্ত রয়েছে .include?তবে এটি কেবল আমার পক্ষ থেকে অনুমান।
ফ্রেগজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.