রুবিতে কোনও ভেরিয়েবল একটি স্ট্রিং কিনা তা পরীক্ষা করুন


উত্তর:


205

আমি মনে করি আপনি খুঁজছেন instance_of?is_a?এবং kind_of?উত্পন্ন ক্লাস থেকে উদাহরণগুলির জন্য সত্য ফিরে আসবে।

class X < String
end

foo = X.new

foo.is_a? String         # true
foo.kind_of? String      # true
foo.instance_of? String  # false
foo.instance_of? X       # true

9
প্রশ্নের অভিপ্রায় না জেনে, আমি বেশিরভাগ বাস্তব-ওয়ার্ল্ড প্রোগ্রামিং পরিস্থিতিতে বলতে পারি, is_a?আসলে ব্যবহার করার জন্য আরও উপযুক্ত আইডিয়ম (এবং প্রায়শই অ্যান্ড্রু গ্রিমের উল্লেখের মতো হাঁসের-টাইপিং চেক আরও ভাল)। একটি কঠোর শ্রেণীর তুলনা সাধারণত কোড গন্ধ হয়। en.wikipedia.org/wiki/Liskov_substitution_principle
mahemoff

দ্রুত সরানো: আপনি যদি শর্তাধীন যুক্তিতে এটি ব্যবহার করেন তবে আপনাকে প্রথম বন্ধনী ব্যবহার করা দরকার; উদাহরণস্বরূপ, যদি foo.is_a? (স্ট্রিং) && ...
ডান

যেমনটি প্রত্যাশা করা হয়েছে, এই পদ্ধতির সাথে কেবল নয় String, পাশাপাশি Integerএবং সাথেও কাজ করবে Float। এটি কি কাজ করে Decimal? ( Decimal
উত্সাহ

29

আরও একটি হাঁসের-টাইপিং পদ্ধতির বলতে হবে

foo.respond_to?(:to_str)

to_str ইঙ্গিত দেয় যে কোনও বস্তুর শ্রেণি স্ট্রিংয়ের প্রকৃত বংশধর নাও হতে পারে, তবে বস্তুটি নিজেই খুব বেশি স্ট্রিং-জাতীয় (স্ট্রিং?)।


কুল। এই ক্ষেত্রে আমি জানতে চাই যে ঘটতে fooপারেন হবে true, false, অথবা একটি ভ্যানিলা স্ট্রিং, কিন্তু এটা ভালো আরও সাধারণ সমাধান জানতে।
ডেভিডচাম্বার

এইটিকে কোনও টোগুলির সাথে সংযুক্ত করুন যাচাই করার পরে বস্তুটি এতে প্রতিক্রিয়া জানায় কিনা এবং আপনি নিজের কাছে একটি স্ট্রিং পেয়েছেন!
seanmakesgames

1
@ স্যানমেকসগেমস আপনার অর্থ ছিল to_str, নাকি to_s? দুটো কিছুটা আলাদা।
অ্যান্ড্রু গ্রিম

stackoverflow.com/questions/11182052/… Re: অ্যান্ড্রু এর মন্তব্য।
সানমেকসগেমস

23

আপনি করতে পারেন:

foo.instance_of?(String)

এবং আরও সাধারণ:

foo.kind_of?(String)

4
কী kind_ofআরও সাধারণ করে তোলে ? তারা সমার্থক বলে মনে: is_a
ডেভিডচাম্বার

2
@ ডেভিডচ্যাম্বার আপনি ঠিক বলেছেন, 'দয়াবান?' 'is_a?' এর প্রতিশব্দ কি?
স্টেনস্ল্যাগ

@ ডেভিডচাম্বারস: আপনি ঠিক বলেছেন, তার instance_of?পরিবর্তে আমি বোঝাতে চাইছি is_a?
ফেডেরিকো বুয়েলস 21

7
foo.instance_of? String

অথবা

foo.kind_of? String 

যদি আপনি কেবল যত্নবান হন যে এটি Stringকোথাও এর উত্তরাধিকার শৃঙ্খলা থেকে প্রাপ্ত হয়েছে


4

অন্যান্য উত্তরগুলির পাশাপাশি ক্লাসটি কোনও বস্তু that শ্রেণীর উদাহরণ কিনা তা পরীক্ষা করার জন্য === পদ্ধতিটি সংজ্ঞায়িত করে।

  • ও এর ক্লাস ক্লাস
  • o.instance_of? সি নির্ধারণ করে যে o.class == গ
  • o.is_a? c o গ এর উদাহরণ বা এর কোন সাবক্লাস?
  • o.kind_of? * is_a? * এর সি প্রতিশব্দ
  • c === o কোন শ্রেণি বা মডিউলটির জন্য, নির্ধারণ করুন * o.is_a কিনা? সি * ( স্ট্রিং === "এস" রিটার্নটি সত্য)

-1

আমি মনে করি আরও ভাল উপায় হ'ল কিছু প্রাক্কলিত পদ্ধতি তৈরি করা। এটি আপনার "একক পয়েন্ট অফ কন্ট্রোল" সংরক্ষণ করবে।

class Object
 def is_string?
   false
 end
end

class String
 def is_string?
   true
 end
end

print "test".is_string? #=> true
print 1.is_string?      #=> false

আরও হাঁসের টাইপিংয়ের উপায়;)


2
সঙ্গে কি ভুল "string".is_a?(String)। দেখে মনে হচ্ছে আপনি চাকাটি নতুন করে নিচ্ছেন। এর রয়েছে class, instance_of, kind_of, ইত্যাদি ... বানর প্যাচ থেকে খারাপ ধারণা Objectবর্গ, এটা অপ্রয়োজনীয় এর উল্লেখ নেই।
মোহামাদ

আমি সম্পূর্ণরূপে আপনার সাথে একমত আছি :) যদি আপনার ফোকাসটি কেবল প্রাইমিটভ প্রকারের দিকে থাকে এবং আপনি জানেন যে আদিম ধরণের সাথে সম্পর্কিত আপনার প্রকল্পের প্রয়োজনীয়তা কখনই পরিবর্তিত হবে না (ঠিক আছে এটি সাধারণত কেস;)) ঠিক আছে। তবে এমন একটি ক্ষেত্রে যেখানে "সিঙ্গেল পয়েন্ট অফ কন্ট্রোল" রাখার জন্য প্রয়োজনীয়তা আরও উন্নত হয়। উদাহরণস্বরূপ আপনার প্রকল্পের পরিবেশে আপনার প্রচুর প্রাক চেক (1000 এবং তার বেশি) রয়েছে। pre_check("test".is_string?) এখন আপনার প্রকল্পের প্রয়োজনীয়তা পরিবর্তন হবে এবং তিনটি অক্ষর বা তার বেশি থাকা প্রতিটি স্ট্রিংকে আর স্ট্রিং হিসাবে সংজ্ঞায়িত করা হয়নি (আমি এটি অস্বাভাবিক জানি;)) এখন আপনি সহজেই নিজের পদ্ধতি পরিবর্তন করতে পারবেন।
schgel11
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.