রুবিতে কোনও বস্তুর প্রকার নির্ধারণ করা


364

আমি যা খুঁজছি তার উদাহরণ হিসাবে আমি পাইথন ব্যবহার করব (আপনি যদি পাইথন না জানেন তবে আপনি এটি সিউডোকোড হিসাবে ভাবতে পারেন):

>>> a = 1
>>> type(a)
<type 'int'>

আমি রুবিতে জানি আমি এটি করতে পারি:

1.9.3p194 :002 > 1.class
 => Fixnum 

তবে এটি কি অবজেক্টের ধরণ নির্ধারণ করার উপযুক্ত উপায়?


5
@ জার্গডব্লিউমিটাগ তবুও এএএফআইসিআর পাইথনে `টাইপ-এটাই করে, যদিও আমার স্মৃতি ঝাপসা। আপনার প্রয়োজন isinstance বা প্রতিক্রিয়াগুলির জন্য পরীক্ষা করতে চান । তবে কেবল "NOES !!!" বলছি সত্যিই সহায়ক নয়, এখন, এটি কি? পরিবর্তে শিক্ষামূলক বলে বিবেচনা করুন।
ডেভ নিউটন

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

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

6
যেহেতু আমরা এখানে রুবি সম্পর্কে সত্যই কথা বলছি, প্রকার এবং শ্রেণিগুলি সমার্থক, এ নিয়ে কোনও বিতর্ক নেই, সমস্ত মানই অবজেক্ট। সুতরাং যে কেউ কেবল রুবি নিয়ে গল্প করার জন্য, ক্লাস হয় ধরন। - রেফ: রুবি-lang.org/en/about
ocodo

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

উত্তর:


607

একটি বস্তু, যা রুবি বিশ্বের একটি টলমলে শব্দ এর "প্রকার" নির্ধারণ করতে সঠিক ভাবে, কল হয় object.class

যেহেতু ক্লাসগুলি অন্যান্য ক্লাস থেকে উত্তরাধিকারী হতে পারে, আপনি যদি কোনও বিষয় "নির্দিষ্ট ধরণের" কিনা তা নির্ধারণ করতে চান তবে আপনি কল object.is_a?(ClassName)করতে পারেন যে এটির objectধরন রয়েছে কিনা তা থেকে কল ClassNameপেয়েছি।

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

উদাহরণস্বরূপ, object.is_a?(String)খুব কঠোর কারণ অন্য শ্রেণি এমন পদ্ধতি প্রয়োগ করতে পারে যা এটিকে স্ট্রিংয়ে রূপান্তর করতে পারে, বা স্ট্রিংয়ের আচরণের সাথে এটি কীভাবে আচরণ করে। object.respond_to?(:to_s)পরীক্ষার জন্য আরও ভাল উপায় হতে পারে যে প্রশ্নে থাকা বস্তুটি যা চায় তা করে।


13
-1। বস্তুর ধরণটি ফেরত #classদেয় না , এটি তার শ্রেণি দেয় । নামটি একটি মৃত শরণাপন্ন হওয়া উচিত। ক্লাস এবং প্রকার দুটি ওওতে সম্পূর্ণ ভিন্ন ধারণা।
Jörg W Mittag

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

18
@ JörgWMittag রুবিতে typeofসি, জাভাস্ক্রিপ্ট এবং অন্যান্য থেকে নিকটতম জিনিস class। অন্য ভাষাগুলির মতো রুবিতে কোনও আনুষ্ঠানিক প্রোটোকল সিস্টেম নেই, ওজেক্টিভ-সি এর সাথে নিকটতম স্মলটাক সম্পর্কিত being আপনি যদি "টাইপ "টিকে" অবজেক্ট হিসাবে সংজ্ঞায়িত করছেন যা গ্রহণযোগ্য ফলাফলের সাথে একটি নির্দিষ্ট পদ্ধতিতে সাড়া দেয় "তবে তা দৃ to় করার কোনও উপায় নেই। এটা ঠিক খুব আলগা। রুবির বেশিরভাগ সময় কোনও বস্তুর প্রকারের উল্লেখ করার সময় বোঝা যায় আপনি ক্লাসের কথা বলছেন। আমি সেই কারণেই উদ্ধৃতি চিহ্নগুলিতে টাইপ শব্দটি ব্যবহার করেছি।
tadman

14
@ জার্গ ডব্লু মিটাগ: আমি দৃ to়ভাবে বলছি যে "শ্রেণি" এবং "প্রকার" অবশ্যই ওওতে সম্পূর্ণ ভিন্ন ধারণা নয়, যেমনটি উদ্ধৃত হয়েছে। (এছাড়াও: আপনি জাভা একটি পরিবর্তনশীল কিভাবে ঘোষণা করছি দান করে? পারেন টাইপ বা বর্গ ভেরিয়েবলের, তার নাম অনুসারে: " int i" বা " Integer j"।) Tadman একটি উপায় প্রশ্ন উভয় প্রশ্নকারী সন্তুষ্ট করলো বললেন এবং সাধারণ শ্রোতা, রুবি ব্যবহার করেছেন এমন পরিভাষাটি পরিষ্কার করার সময়। অবজেক্ট-ওরিয়েন্টেড টার্মিনোলজির সূক্ষ্ম পয়েন্টগুলির তুলনায় আমার একাডেমিক চুল বিভক্ত হওয়ার আগ্রহ নেই, তাই দয়া করে শেষ শব্দটি রাখুন।
তিমু লইস্তি

11
ঝামেলা @TeemuLeisti সর্বাধিক এখানে যে থেকে আসে সবকিছু রুবি মধ্যে একটি বস্তুর হয়, এবং তাই একটি বর্গ আছে, কার্যত প্রতিটি ভাষায় আছে যেহেতু আদিম ধরনের যা না বস্তু এবং কোন ক্লাস আছে বস্তু যা করতে বিপরীতে। যখন খাঁটি ধরণের মতো কোনও জিনিস নেই এবং কোনওভাবে আনুষ্ঠানিকভাবে কোনও সংজ্ঞা দেওয়ার উপায় নেই, তখন রুবি বিশ্বে অর্থটি বিশেষভাবে দুর্বল হয়ে পড়ে। মাতজ তার নিজের ব্যতীত অন্য কোনও নির্দিষ্ট চিন্তাবিদ্যার সাথে কঠোরভাবে মেনে চলছেন না।
তাদমান


44

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

তাই অনেক ক্ষেত্রে (বেশিরভাগ না হলেও) ক্ষেত্রে হাঁসের টাইপিং ব্যবহার করে সবচেয়ে ভাল #respond_to?(method):

object.respond_to?(:to_i)

1
বৈধ বিন্দু. প্রশ্নের উত্তর দেয় না তবে প্রশ্নের আত্মাকে আঘাত করে।
ব্যবহারকারী566245

@ ব্যবহারকারী 666245৪৫ এটি ভালভাবে সাড়া দেয়? খুব নিশ্চিত উত্তরগুলির প্রশ্নের উত্তর দেওয়া দরকার।
আর। রিনকন

17

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

সুতরাং আমরা এটি উপভোগ করতে পারেন।

https://www.youtube.com/watch?v=1l3U1X3z0CE

তবে রুবি কেবল শ্রেণীর অবজেক্টের ধরণের বিষয়ে খুব বেশি যত্ন করে না। আমরা ক্লাস ব্যবহার করি না প্রকারের। সমস্ত ডেটা তখন একটি বর্গ আছে।

12345.class

'my string'.class

তাদের পূর্বপুরুষও থাকতে পারে

Object.ancestors

তাদের মেটা ক্লাসও রয়েছে তবে আমি সে সম্পর্কিত বিশদগুলি সংরক্ষণ করব।

আপনি যখন ক্লাসটি জানবেন তখন আপনি এটির জন্য কী কী পদ্ধতি ব্যবহার করতে পারবেন তা সন্ধান করতে সক্ষম হবেন। সেখানেই "ডেটা টাইপ" দরকার। আপনি যদি সত্যিই বিশদে যেতে চান তবে সন্ধান করুন ...

"রুবি অবজেক্ট মডেল"

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

হ্যাঁ! ক্লাসটি হ'ল ডেটা টাইপ। অবজেক্টগুলির ক্লাস রয়েছে এবং ডেটা রয়েছে ধরণের। সুতরাং যদি আপনি ডেটা বেসগুলি সম্পর্কে জানেন তবে আপনি জানেন কেবলমাত্র সীমাবদ্ধ প্রকারের সেট রয়েছে।

পাঠ্য ব্লক সংখ্যা


উদাহরণস্বরূপ,Object.ancestors # => [Object, Kernel, BasicObject]
ডোরিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.