উত্তর:
না না. এটি একটি মানকে বুলিয়ান রূপান্তর করতে ব্যবহৃত হয়:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
এটি সাধারণত ব্যবহারের প্রয়োজন হয় না কারণ যেহেতু রুবির একমাত্র মিথ্যা মানগুলি হয় nil
এবংfalse
তাই সাধারণত যে সম্মেলনটি দাঁড়ানো ভাল।
এটি হিসাবে চিন্তা করুন
!(!some_val)
বৈধভাবে এটির জন্য ব্যবহৃত একটি জিনিস হ'ল বিপুল পরিমাণ তথ্য ফেরত আসা থেকে বিরত। উদাহরণস্বরূপ আপনি সম্ভবত আপনার has_image?
পদ্ধতিতে 3MB চিত্রের ডেটা ফেরত দিতে চান না, বা আপনি পদ্ধতিটিতে আপনার সম্পূর্ণ ব্যবহারকারী অবজেক্টটি ফিরিয়ে দিতে চান না logged_in?
। !!
এই বিষয়বস্তু ব্যবহার করে একটি সাধারণ true
/ false
।
.nil?
ব্যবহারের পরিবর্তে ফিরে আসবেন না কেন !!
? পার্থক্য আছে কি?
!!true #=> true
এবংtrue.nil? #=> false
!
এর অর্থ বুলিয়ান রাজ্যটিকে তুচ্ছ করা, দু'টি !
দ্বিগুণ প্রত্যাশা ব্যতীত বিশেষ কিছু নয়।
!true == false
# => true
এটি সাধারণত কোনও পদ্ধতিকে বলিয়ান ফেরত দেওয়ার জন্য বাধ্য করা হয়। এটি স্ট্রিং, পূর্ণসংখ্যা এবং কী নয় এর মতো কোনও ধরণের সত্যতা সনাক্ত করবে এবং এটিকে বুলিয়ান হিসাবে রূপান্তর করবে।
!"wtf"
# => false
!!"wtf"
# => true
আরও প্রকৃত ব্যবহারের কেস:
def title
"I return a string."
end
def title_exists?
!!title
end
আপনি যখন বুলিয়ান ফিরে পেয়েছেন তা নিশ্চিত করতে চাইলে এটি দরকারী। আইএমএইচও এটি এক ধরণের অর্থহীন, যদিও উভয়ই if 'some string'
এবং if true
হুবহু একই প্রবাহ হ'ল, তবে কিছু লোক স্পষ্টভাবে একটি বুলিয়ান ফিরিয়ে আনতে দরকারী বলে মনে করে।
title
, পাশাপাশি এটি নিকটতম জিনিসটিও করতে পারে ... আমি মনে করি
নোট করুন যে এই আইডিয়ামটি অন্যান্য প্রোগ্রামিং ভাষায়ও বিদ্যমান। সি এর অভ্যন্তরীণ bool
ধরণ ছিল না , সুতরাং সমস্ত বুলিয়ান তার int
পরিবর্তে টাইপ করা হয়েছিল, এর মানকীয় মান সহ 0
বা 1
। এই উদাহরণটি নেয় (স্বচ্ছতার জন্য প্রথম বন্ধনী যুক্ত হয়েছে):
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
"নন-নন" সিনট্যাক্সটি কোনও নন-শূন্য পূর্ণসংখ্যাকে রূপান্তর করে 1
, ক্যানোনিকাল বুলিয়ান সত্য মান।
যদিও সাধারণভাবে, আমি এই অস্বাভাবিক প্রবাদটি ব্যবহার করার চেয়ে যুক্তিসঙ্গত তুলনা করা আরও ভাল মনে করি:
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
এটি কার্যকর যদি আপনার একচেটিয়া বা করার প্রয়োজন হয় । সামান্য পরিবর্তনের মাধ্যমে ম্যাট ভ্যান হর্নের উত্তরটি অনুলিপি করা হচ্ছে:
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
আমি দুটি ভেরিয়েবল উভয়ই শূন্য, বা উভয়ই শূন্য নয় তা নিশ্চিত করতে এটি ব্যবহার করেছি।
raise "Inconsistency" if !!a ^ !!b
এটি "ডাবল-নেগেটিভ" তবে অনুশীলনটিকে নিরুৎসাহিত করা হচ্ছে। আপনি যদি রুবোকপ ব্যবহার করছেন তবে আপনি এটির সাথে এই জাতীয় কোডে অভিযোগ দেখতে পাবেনStyle/DoubleNegation
লঙ্ঘনের ।
যুক্তিপূর্ণ পদ বলে:
যেহেতু এটি উভয় ক্রিপ্টিক এবং সাধারণত অনর্থক, তাই এড়ানো উচিত [তারপরে প্যারাফ্রেসিং]] পরিবর্তন
!!something
করুন!something.nil?
!!false # => false
যখন!false.nil? # => true
!(foo.nil? || foo == false)
- আরও ভার্বোজ, হ্যাঁ, তবে কম ক্রিপ্টিক।
এটি কীভাবে কাজ করে তা বোঝার জন্য আপনাকে যদি একটি বুলিয়ান রূপান্তর করতে, বলুন, প্রয়োজন হয়। আমার কাছে কোড রয়েছে যা classy_enum
রত্ন ব্যবহার করে ঠিক তা করে :
class LinkStatus < ClassyEnum::Base
def !
return true
end
end
class LinkStatus::No < LinkStatus
end
class LinkStatus::Claimed < LinkStatus
def !
return false
end
end
class LinkStatus::Confirmed < LinkStatus
def !
return false
end
end
class LinkStatus::Denied < LinkStatus
end
তারপরে আমার কাছে পরিষেবা কোড রয়েছে, উদাহরণস্বরূপ:
raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.
কার্যকরভাবে bangbang অপারেটর হয়ে গেছে যা আমি অন্যথায় টু_বুল নামে একটি পদ্ধতি হিসাবে লিখেছিলাম।