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


122

কোনও বস্তু সহজেই বুলিয়ান কিনা তা আমি দেখতে পারছি না। রুবিতে কি এরকম কিছু আছে?

true.is_a?(Boolean)
false.is_a?(Boolean)

এখনই আমি এটি করছি এবং এটি সংক্ষিপ্ত করতে চাই:

some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))

উত্তর:


136

সবচেয়ে সহজ উপায় যা আমি ভাবতে পারি:

# checking whether foo is a boolean
!!foo == foo

6
দশম শ্রেণি; ডিফ! স্ব-শেষ প্রান্ত; x = এক্স.নিউ; !! x == x # => সত্য
অ্যালেক্সি

5
হ্যাঁ, এটিকে বলা হয় হাঁসের টাইপিং এবং ওওপির একটি মূল নীতি। আমি মনে করি এটি একটি বৈশিষ্ট্য।
কনস্ট্যান্টিন হায়েস

62
সংক্ষিপ্তটি অগত্যা সহজ বোঝায় না। যার অর্থ আমি ডাব্লুটিএফ?
গ্রান্ট বার্চমিয়ার

11
ফু-কে বুলেয়ান রূপান্তরিত করে, এটি ফু-এর মতো কিনা তা পরীক্ষা করে।
কনস্ট্যান্টিন হায়েস

9
নোট করুন যে কিছু চেকার (যেমন রুবকপ ) দ্বিগুণ প্রত্যাখ্যানকে খারাপ স্টাইল হিসাবে বিবেচনা করে ।
স্কুবার্থ

104

আমি এটি সংক্ষিপ্ত এবং স্ব-ডকুমেন্টিং বলে মনে করি:

[true, false].include? foo

যদি রেলস বা অ্যাক্টিভসপোর্ট ব্যবহার করে থাকেন তবে আপনি ব্যবহার করে সরাসরি ক্যোয়ারীও করতে পারেন in?

foo.in? [true, false]

সমস্ত সম্ভাব্য মানগুলির বিরুদ্ধে যাচাই করা আমি ভাসমানগুলির জন্য প্রস্তাবিত এমন কিছু নয়, যখন কেবল দুটি সম্ভাব্য মান থাকে!


1
এখন পর্যন্ত সেরা উত্তর, যদিও আমি এটি পছন্দ করেছি foo == true or foo == falseযে কেউ একটি মন্তব্য করেছে।
রায়ান টেইলর

3
আমি এটি পছন্দ করি কারণ এটি চেয়ে অভিপ্রায় কম রহস্যপূর্ণ !!foo == foo
stringsn88keys

নিখরচায় অজগর! অবশ্যই এখানে এখন পর্যন্ত সবচেয়ে শব্দার্থক উত্তর।
জেএম জানজেন

85

কোন নেই Booleanরুবি মধ্যে বর্গ, চেক করার একমাত্র উপায় কি করছো তুমি (বিরুদ্ধে বস্তুর তুলনা করতে হয় trueএবং falseবা বিরুদ্ধে বস্তুর শ্রেণী TrueClassএবং FalseClass)। আপনার কেন এই কার্যকারিতাটির প্রয়োজন হবে তা ভাবতে পারছেন না, তবে কি আপনি ব্যাখ্যা করতে পারেন? :)

তবে আপনার যদি সত্যিই এই কার্যকারিতাটির প্রয়োজন হয় তবে আপনি এটি হ্যাক করতে পারেন:

module Boolean; end
class TrueClass; include Boolean; end
class FalseClass; include Boolean; end

true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true

1
বর্তমান মানের উপর ভিত্তি করে টাইপকাস্টিং করার চেষ্টা করছি।
ল্যান্স পোলার্ড

75
'কেন এমন হবে কেন?' (এবং ডেরিভেটিভস) একজন প্রকৌশলী আরেকটি তৈরি করতে পারে এমন সবচেয়ে বিরক্তিকর প্রশ্নগুলির মধ্যে একটি :)
Vemv

11
+1 কারণ আমি এটি আরএসপিতে যেমন ব্যবহার করতে পারি:expect(some_method?(data)).to be_a(Boolean)
অটোমেটিক

3
অন্যান্য ক্ষেত্রে যখন টাইপ চেক করা দরকার, যখন আপনি ডাটাবেস অ্যাডাপ্টারটি প্রয়োগ করেন এবং "quotes"সংখ্যার এবং বুলিয়ান নয় তবে
মোড়কের

23

উপরে উল্লিখিত হিসাবে বুলিয়ান শ্রেণি নেই ঠিক ট্রু ক্লাস এবং ফলসক্লাস তবে আপনি যেকোন অবজেক্টকে যদি / যদি না এবং বিষয়গুলি ফলসক্লাস এবং নীল উদাহরণ ব্যতীত সত্য হিসাবে ব্যবহার করতে পারেন তবে

বুলিয়ান পরীক্ষাগুলি ফলসক্লাস বা ট্রু ক্লাসের উদাহরণ দেয়

(1 > 0).class #TrueClass

অবজেক্টের নীচে বানরপ্যাচ আপনাকে জানাবে যে কোনও কিছু ট্রু ক্লাস বা ফলসক্লাসের উদাহরণ

class Object
  def boolean?
    self.is_a?(TrueClass) || self.is_a?(FalseClass) 
  end
end

আইআরবি দিয়ে কিছু পরীক্ষা চালানো নিম্নলিখিত ফলাফল দেয়

?> "String".boolean?
=> false
>> 1.boolean?
=> false
>> Time.now.boolean?
=> false
>> nil.boolean?
=> false
>> true.boolean?
=> true
>> false.boolean?
=> true
>> (1 ==1).boolean?
=> true
>> (1 ==2).boolean?
=> true

4
সহজ লেখার জন্য self == true or self == false। সেগুলি হ'ল সত্যিকারের ক্লাস এবং ফলসক্লাসের একমাত্র দৃষ্টান্ত।
চাক

@ ছক যা টাইম.নো.বুলিয়ান ছাড়াও একই ফলাফল দেয়? যা শূন্য দেয়। কোন ধারণা কেন?
স্টিভ ওয়েট

পদ্ধতিতে নিজের উপর একটি শ্রেণীর চেক সংজ্ঞায়িত করা কিছুটা ওপরে নয়। আপনার দুটি সংস্করণ সংজ্ঞা দেওয়া উচিত boolean, একটি ট্রু ক্লাস / ফলসক্লাসের জন্য এবং একটি বস্তুর জন্য।
কনস্টান্টিন হায়েস

4
কারণটি হ'ল Time#==রুবি ১.৮ -এর সংস্করণে থাকা একটি বাগের কারণে নন-টাইম মানগুলির সাথে মিথ্যা পরিবর্তে শূন্যতার সাথে ফিরে আসার তুলনা হয়।
চক

17

যদি আপনার কোডটি বোধগম্যভাবে কেস স্টেটমেন্ট হিসাবে লেখা যায় তবে এটি বেশ শালীন:

case mybool
when TrueClass, FalseClass
  puts "It's a bool!"
else
  puts "It's something else!"
end

6

যে বস্তুটি বুলিয়ান, সেগুলির মধ্যে হয় ট্রু ক্লাস বা ফলসক্লাসের শ্রেণি থাকবে তাই নিম্নলিখিত এক-লাইনারটি কৌশলটি করা উচিত

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true

নিম্নলিখিতগুলি আপনাকে সত্য / মিথ্যা বুলেটিয়ান প্রকারের চেক ফলাফলও দেবে

mybool = true    
[TrueClass, FalseClass].include?(mybool.class)
=> true

4

সুতরাং (x == true) ^ (x == false)আপনার প্রথম বন্ধনী প্রয়োজন তবে এটি আরও সুন্দর এবং কমপ্যাক্ট note

এমনকি এটি "কুয়াক" এর মতো প্রস্তাবিত পাস করে তবে "কুয়াক" নয় ... class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)

দ্রষ্টব্য : দেখুন যে এটি এতই মৌলিক যে আপনি এটি অন্যান্য ভাষায়ও ব্যবহার করতে পারেন, এটি "জিনিসটি বুলিয়ান" সরবরাহ করে না।

দ্রষ্টব্য 2 : এছাড়াও আপনি এটি ব্যবহার করতে পারেন জিনিসটিকে একটি বলে ??:"red", "green", "blue"আপনি যদিadd more XORS... বা এই জিনিসটির মধ্যে একটি হয় তবে ??:4, 5, 8, 35


এক্সওআর কেন? কেন না?
নাকিলন

2

এই রত্নটি দরকারী পদ্ধতির সাথে রুবিতে একটি বুলিয়ান ক্লাস যুক্ত করে।

https://github.com/RISCfuture/boolean

ব্যবহার করুন:

require 'boolean'

তাহলে তোমার

true.is_a?(Boolean)
false.is_a?(Boolean)

আপনি আশা হিসাবে ঠিক কাজ করবে।


0

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

NameError: uninitialized constant Boolean

মনে রাখবেন যে বিষয়গুলিতে প্রকারভেদ নেই। তারা ক্লাস হয়। বস্তুর ডেটা রয়েছে have এই কারণেই যখন আপনি ডেটা টাইপ বলবেন এটি কিছুটা মিসনোমার।

র‌্যান্ড 2 টি চেষ্টা করুন কারণ র‌্যান্ড 1 সর্বদা 0 দেয় বলে মনে হয় rand র‌্যান্ড 2 1 বা 0 ক্লিক এখানে কয়েকবার রান রান করবে। https://repl.it/IOPx/7

যদিও আমি নিজেই বুলিয়ান ক্লাস তৈরি করতে যাব তা আমি জানতাম না। আমি এটি নিয়ে পরীক্ষা করেছি কিন্তু ...

class Boolean < TrueClass
  self
end

true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false

কমপক্ষে আমাদের এখন সেই শ্রেণি আছে তবে কে সঠিক মূল্যবানতা পাবে কে জানে?

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