রুবি: দয়ালু_? বনাম উদাহরণ_? বনাম ইস_এ?


487

পার্থক্য কি? আমি কখন ব্যবহার করব? কেন তাদের অনেক আছে?


18
উভয়ই কেন is_a?এবং kind_of?বিদ্যমান তা: আমি মনে করি এটি রুবির ডিজাইনের দর্শনের অংশ part পাইথন বলতেন, কিছু করার একমাত্র উপায় থাকতে হবে; রুবির প্রায়শই সমার্থক পদ্ধতি থাকে যাতে আপনি যেটিকে আরও ভাল লাগে তা ব্যবহার করতে পারেন। এটা পছন্দসই বিষয়। এটি আংশিকভাবে জাপানের প্রভাবের কারণে হতে পারে: আমাকে বলা হয়েছে যে তারা বাক্যটিকে আরও সুন্দর করে তুলতে বাক্যটির উপর নির্ভর করে একই সংখ্যার জন্য আলাদা শব্দ ব্যবহার করবে। মাত্জ এই ধারণাটি তাঁর ভাষার নকশায় নিয়ে যেতে পারেন।
নাথান লং

@ নাথানলং আমি মনে করি না জাপানী কাউন্টারগুলির এর সাথে অনেক কিছু করার আছে; সমস্ত ভাষায় কিছুটা চুক্তি রয়েছে এবং আপনি বেশিরভাগ সময় এক কাউন্টারকে প্রতিস্থাপন করতে পারবেন না (যেমন, আপনি ফ্ল্যাট অবজেক্টের জন্য সিলিন্ডার কাউন্টার ব্যবহার করতে পারবেন না; এটি কেবল ভুল)। এবং এটি শব্দকৌতুক সঙ্গে মাতৃত্বের সাথে আরও কিছু করার আছে।
কেসি

উত্তর:


621

kind_of?এবং is_a?সমার্থক।

instance_of?অন্য দুটি থেকে পৃথক যে এটি কেবল তখনই প্রত্যাবর্তন করে trueযখন অবজেক্টটি সঠিক শ্রেণীর উদাহরণ, সাবক্লাস নয়।

উদাহরণ:

  • "hello".is_a? Objectএবং "hello".kind_of? Objectফিরে আসুন trueকারণ "hello"এটি একটি Stringএবং Stringএকটি সাবক্লাস Object
  • তবে "hello".instance_of? Objectফেরৎ false

77
এটি কেবল কখনও কখনও আরও ভাল পড়ে। ভাবুন @honda.kind_of? Carএবং @person.is_a? Administrator, রুবি সমস্ত নান্দনিকতা সম্পর্কে। আসলে, ব্যাকরণগত ত্রুটি লক্ষ্য করুন ... সক্রিয় সহায়তায় আপনি লিখতে পারেন @person.is_an? Administrator:) ... এটি সম্ভবত এতক্ষণে এটি রুবি কোরতে পরিণত হয়েছে।
rfunduk

2
হেই এটি একটি আকর্ষণীয় কারণ। তুমি কি এটাকে ভেঙে ফেলতে পারবে? আপনি কি ওভাররাইড করতে পারেন kind_of?কিন্তু না is_a??
ক্লাদিউ

3
@ থেন্ডুকস, is_an?রুবি -১.৯.২-পি0-এ নেই। @ ক্লাদিউ, না। is_a?এর কেবল একটি উপনামkind_of? । উভয় পদ্ধতি একই সি ফাংশন প্রার্থনা rb_obj_is_kind_of,।
ma11 শেই 28

9
@ ম্যাট: অ্যালাইজড ফাংশনটি ওভাররাইড না করেই আপনি একটি উপাধাকে ওভাররাইড করতে পারেন। তাই হ্যাঁ, আপনি ওভাররাইড করতে পারে kind_of?অগ্রাহ্য ছাড়া is_a?
sepp2k

4
এই অ্যাকটিসসপোর্ট is_an?পদ্ধতিটি কোথায় ?! এটি বর্তমান রেল সংস্করণে নেই এবং এটির হ্রাস করা সম্পর্কে আমি গুগলে কিছুই খুঁজে পাচ্ছি না।
টম লর্ড

22

পার্থক্য কি?

ডকুমেন্টেশন থেকে:

- ( বুলিয়ান )instance_of?(class)
ফেরত পাঠায় trueযদি objপ্রদত্ত ক্লাসের একটা নিদর্শন হয়।

এবং:

- ( বুলিয়ান ) is_a?(class)
- ( বুলিয়ান )kind_of?(class)
রিটার্নস trueযদি classএর বর্গ obj, অথবা যদি classএর superclasses এক objবা মডিউল অন্তর্ভুক্ত obj

যদি এটি অস্পষ্ট থাকে তবে ঠিক কী অস্পষ্ট তা জেনে ভাল লাগবে , যাতে ডকুমেন্টেশনটি উন্নত করা যায়।

আমি কখন ব্যবহার করব?

কখনও। পরিবর্তে পলিমারফিজম ব্যবহার করুন।

কেন তাদের অনেক আছে?

আমি দু'জনকে "অনেক" ডাকব না । তাদের মধ্যে দুটি রয়েছে কারণ তারা দুটি ভিন্ন কাজ করে।


3
আমি মনে করি আমার বিভ্রান্তিটি ছিল যে এখানে 3 আছে এবং 2 যে ঠিক একই জিনিসটি করে এবং বিভিন্ন নাম রয়েছে। পলিমারফিজম ব্যবহার সম্পর্কে - আমি সম্মত, তবে রুবি স্ট্যান্ডার্ড লাইব্রেরি এগুলির প্রতিটি ব্যবহারে পূর্ণ
ক্লাডিউ

4
বহুত্ববাদ বলতে কী বোঝ? এটি কি হাঁসের টাইপিংয়ের মতো?
অ্যান্ড্রু গ্রিম

2
হ্যাঁ, তারা একই রকম। হাঁসের টাইপিং একপ্রকার পলিমারফিজম।
স্পেসঘোস্ট

3
পলিমারফিজম করা প্রায়শই ভাল, হ্যাঁ, তবে এমন কিছু সীমান্ত রয়েছে যেখানে আপনি সত্যিই জানতে চান যে আপনার একটি নির্দিষ্ট বর্গ রয়েছে, যেমন আপনি যখন ফাইলগুলি নিয়ে কাজ করছেন তখন।
অটোমেটিকো

6

এটা আরো বস্তু জিজ্ঞাসা করতে কিনা তারা একটি পদ্ধতি সাড়া আপনার যা দরকার বা না ব্যবহার রুবি-মত হল respond_to?। এটি ন্যূনতম ইন্টারফেস এবং বাস্তবায়ন অজানা প্রোগ্রামিং উভয়কেই অনুমতি দেয়।

এটি অবশ্যই সর্বদা প্রযোজ্য নয়, সুতরাং আপনি যে পদ্ধতিগুলির বিষয়ে জিজ্ঞাসা করছেন সেগুলি ব্যবহার করে "ধরণ" সম্পর্কে আরও রক্ষণশীল বোঝার বিষয়ে জিজ্ঞাসা করার সম্ভাবনা রয়েছে যা শ্রেণি বা বেস শ্রেণি।


5
এটি পরিস্থিতির উপর নির্ভর করে। মন্তব্য এবং ব্লগ উভয়ই তৈরি_এতে সাড়া দিতে পারে। এমন পরিস্থিতিতে কি_এ? আরও উপযুক্ত আইএমএইচও
পেনকভস্কি

এটির কোনও অর্থ নেই, যদি আপনাকে একে অপরের থেকে কোনও মন্তব্য এবং একটি ব্লগ অবজেক্টের পার্থক্য করার প্রয়োজন হয়, আপনি এটি তৈরি করতে সহজভাবে তৈরি করবেন না। এটি নির্ধারণ করে না যে আপনি এমন একটি পদ্ধতি লিখতে পারেন যা এমন কোনও বস্তু গ্রহণ করে যা তৈরি_এটের প্রতিক্রিয়া জানায়। যদি এর কাজটি করার জন্য অন্য কোনও প্রয়োজন না হয় তবে আপনি নিরাপদে মন্তব্য বা ব্লগে বা অন্য কোনও অ্যাক্টিভেকর্ড মডেলটিতে এটি নিরাপদে ব্যবহার করতে পারেন।
কিংডন

3

আমি দু'জনকেও কল করবো না ( is_a?এবং kind_of?একই পদ্ধতির বিকল্প) তবে আপনি যদি আরও সম্ভাবনা দেখতে চান তবে আপনার মনোযোগটি #classপদ্ধতির দিকে ঘুরিয়ে দিন :

A = Class.new
B = Class.new A

a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class

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