কি করে !! রুবি মানে?


উত্তর:


161

না না. এটি একটি মানকে বুলিয়ান রূপান্তর করতে ব্যবহৃত হয়:

!!nil   #=> false
!!"abc" #=> true
!!false #=> false

এটি সাধারণত ব্যবহারের প্রয়োজন হয় না কারণ যেহেতু রুবির একমাত্র মিথ্যা মানগুলি হয় nilএবংfalse তাই সাধারণত যে সম্মেলনটি দাঁড়ানো ভাল।

এটি হিসাবে চিন্তা করুন

!(!some_val)

বৈধভাবে এটির জন্য ব্যবহৃত একটি জিনিস হ'ল বিপুল পরিমাণ তথ্য ফেরত আসা থেকে বিরত। উদাহরণস্বরূপ আপনি সম্ভবত আপনার has_image?পদ্ধতিতে 3MB চিত্রের ডেটা ফেরত দিতে চান না, বা আপনি পদ্ধতিটিতে আপনার সম্পূর্ণ ব্যবহারকারী অবজেক্টটি ফিরিয়ে দিতে চান না logged_in?!!এই বিষয়বস্তু ব্যবহার করে একটি সাধারণ true/ false


8
এটি ব্যবহার করা খারাপ অভ্যাস নয়। ডাবল ব্যাং প্রায়শই স্পষ্টভাবে বুলিয়ান মান ফেরত দিতে পূর্বাভাসে (পদ্ধতিগুলি শেষ হয়?) ব্যবহৃত হয়।
সোয়ানান্দ

6
অ্যালেক্স, আপনাকে বড় আকারের জিনিসগুলি ফিরিয়ে আনার বিষয়ে সত্যই চিন্তা করার দরকার নেই, কারণ রুবি কোনও রেফারেন্স দেবে, বস্তুর অনুলিপি নয়।
ডিএসিমন

10
@ ডিডিমন, কখনও কখনও আপনার বড় আকারের জিনিসগুলি নিয়ে চিন্তা করতে হবে যেমন ডিবাগিংয়ের সময় কোনও মান মুদ্রণ বা লগ করার সময়।
ওয়েইন কনরাড

শুধু .nil?ব্যবহারের পরিবর্তে ফিরে আসবেন না কেন !!? পার্থক্য আছে কি?
ashes999

3
যখন আপনার মানটি বুয়েলান হয় তখন একটি পার্থক্য থাকে। !!true #=> trueএবংtrue.nil? #=> false
অ্যালেক্স ওয়েন

31

এটা তোলে ফেরৎ trueযদি ডান দিকে অবজেক্ট নয় nilএবং false, falseযদি তা না হয় nilবাfalse

def logged_in?   
  !!@current_user
end

1
এটা কি স্পষ্টতই রেস্টফুল_আউথ থেকে এসেছে ?! : ডি
ক্যামেরন

14

!এর অর্থ বুলিয়ান রাজ্যটিকে তুচ্ছ করা, দু'টি !দ্বিগুণ প্রত্যাশা ব্যতীত বিশেষ কিছু নয়।

!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, পাশাপাশি এটি নিকটতম জিনিসটিও করতে পারে ... আমি মনে করি
কারসন মায়ার্স

6

নোট করুন যে এই আইডিয়ামটি অন্যান্য প্রোগ্রামিং ভাষায়ও বিদ্যমান। সি এর অভ্যন্তরীণ boolধরণ ছিল না , সুতরাং সমস্ত বুলিয়ান তার intপরিবর্তে টাইপ করা হয়েছিল, এর মানকীয় মান সহ 0বা 1। এই উদাহরণটি নেয় (স্বচ্ছতার জন্য প্রথম বন্ধনী যুক্ত হয়েছে):

!(1234) == 0
!(0) == 1
!(!(1234)) == 1

"নন-নন" সিনট্যাক্সটি কোনও নন-শূন্য পূর্ণসংখ্যাকে রূপান্তর করে 1, ক্যানোনিকাল বুলিয়ান সত্য মান।

যদিও সাধারণভাবে, আমি এই অস্বাভাবিক প্রবাদটি ব্যবহার করার চেয়ে যুক্তিসঙ্গত তুলনা করা আরও ভাল মনে করি:

int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious

অথবা ঠিক যদি (এক্স)। !! আপনি 0/1 পেতে হয় যখন দরকারী। আপনি (এক্স) বিবেচনা বা বিবেচনা করতে পারেন? 1: 0 পরিষ্কার।
ডারোবার্ট

3

এটি কার্যকর যদি আপনার একচেটিয়া বা করার প্রয়োজন হয় । সামান্য পরিবর্তনের মাধ্যমে ম্যাট ভ্যান হর্নের উত্তরটি অনুলিপি করা হচ্ছে:

1 ^ true
TypeError: can't convert true into Integer

!!1 ^ !!true
=> false

আমি দুটি ভেরিয়েবল উভয়ই শূন্য, বা উভয়ই শূন্য নয় তা নিশ্চিত করতে এটি ব্যবহার করেছি।

raise "Inconsistency" if !!a ^ !!b

3

এটি "ডাবল-নেগেটিভ" তবে অনুশীলনটিকে নিরুৎসাহিত করা হচ্ছে। আপনি যদি রুবোকপ ব্যবহার করছেন তবে আপনি এটির সাথে এই জাতীয় কোডে অভিযোগ দেখতে পাবেনStyle/DoubleNegation লঙ্ঘনের ।

যুক্তিপূর্ণ পদ বলে:

যেহেতু এটি উভয় ক্রিপ্টিক এবং সাধারণত অনর্থক, তাই এড়ানো উচিত [তারপরে প্যারাফ্রেসিং]] পরিবর্তন !!somethingকরুন!something.nil?


1
তবে ... !!false # => falseযখন!false.nil? # => true
ডগ

@ ডগ আপনি যদি জানেন যে আপনার বুলিয়ান মান রয়েছে তবে এটি অতিরিক্ত কাজ করবে (কেবলমাত্র মানটি ব্যবহার করুন)। আপনি যদি না করেন তবে আপনি ব্যবহার করতে পারেন !(foo.nil? || foo == false)- আরও ভার্বোজ, হ্যাঁ, তবে কম ক্রিপ্টিক।
ডেভিড মোলস

0

এটি কীভাবে কাজ করে তা বোঝার জন্য আপনাকে যদি একটি বুলিয়ান রূপান্তর করতে, বলুন, প্রয়োজন হয়। আমার কাছে কোড রয়েছে যা 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 অপারেটর হয়ে গেছে যা আমি অন্যথায় টু_বুল নামে একটি পদ্ধতি হিসাবে লিখেছিলাম।

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