নোট_নিলের জন্য কি কোনও রুবি, বা রুবি-ইসম আছে? শূন্যের বিপরীতে? পদ্ধতি?


87

আমি রুবির অভিজ্ঞ নই, তাই আমার কোডটি "কুশ্রী" বোধ করে এবং মূio় নয়:

def logged_in?
  !user.nil?
end

আমি বরং কিছু চাই

def logged_in?
  user.not_nil?
end

কিন্তু এমন কোনও পদ্ধতি খুঁজে পায় না যা বিরোধিতা করে nil?

উত্তর:


51

আপনি যখন অ্যাক্টিভসপোর্টটি ব্যবহার করছেন, কেবলমাত্র নন- শূন্যতার জন্য যাচাই করার জন্য user.present? http://api.rubyonrails.org/classes/Object.html#method-i-premitted%3F রয়েছে , কেন ব্যবহার করবেন না

def logged_in?
  user # or !!user if you really want boolean's
end

48
সাবধান: present?একটি ফাঁকা স্ট্রিং দরকার। ! "".nil?সত্য ফিরে, কিন্তু "".present?মিথ্যা প্রত্যাবর্তন।
lambshaanxy

9
সাবধান 2: আমি এটিও নোট করব !! ব্যবহারকারী ব্যবহারকারীর শূন্য হওয়া এবং ব্যবহারকারী মিথ্যা হওয়ার মধ্যে পার্থক্য করে না; ডাবল-ব্যাং ব্যবহারগুলি এই দুটিকে সংযুক্ত করে। সুতরাং যদি আপনি সত্যিকার অর্থে নির্ধারণ করতে চান যে কোনও বস্তু শূন্য নয় (যার অর্থ এটি: সত্য, মিথ্যা, 0, "", শূন্য ব্যতীত অন্য কিছু) তবে আপনার 'কুৎসিত' পদ্ধতিটি ব্যবহার করা উচিত যা বার্কগুলি পছন্দ করে না বা নীচে @ টেম্পাস প্রস্তাবিত বানরপ্যাচ । এই ক্ষেত্রে যেখানে শূন্য হয় না অবশ্যই না প্রয়োজন (পাগল একজন ব্যবহারকারী), পদ্ধতির Samo? কর্তৃক গৃহীত অন্তত কুশ্রী, নিচ হয়।
likethesky

12
false.present? == false !false.nil? == true
দুডো

4
এই উত্তরটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না। এটি এই নির্দিষ্ট বাস্তবায়ন সমস্যার একটি উত্তর।
একসটাইন

4
এই উত্তরটি সঠিক নয়। মিথ্যা.নিল? মিথ্যা, যদিও মিথ্যা? এও কি মিথ্যা!
মাইক 23

49

আপনি বুলিয়ানগুলির সাথে অত্যধিক উদ্বিগ্ন বলে মনে হচ্ছে।

def logged_in?
  user
end

যদি ব্যবহারকারী শূন্য থাকে তবে লগইন_ইন? একটি "ভুয়া" মান প্রদান করবে। অন্যথায়, এটি কোনও বস্তু ফেরত দেবে। রুবিতে আমাদের সত্য বা মিথ্যা ফেরার দরকার নেই, যেহেতু জাভাস্ক্রিপ্টের মতো আমাদের "সত্যবাদী" এবং "মিথ্যা" মান রয়েছে।

হালনাগাদ

আপনি যদি রেলগুলি ব্যবহার করেন তবে আপনি present?পদ্ধতিটি ব্যবহার করে এটি আরও সুন্দরভাবে পড়তে পারেন :

def logged_in?
  user.present?
end

4
একটি পদ্ধতির সাথে শেষ হওয়ার প্রত্যাশাটি ?এটি একটি বুলিয়ান দেয়। !!valueযে কোনও কিছুকে বুলিয়ান রূপান্তর করার সর্বোত্তম উপায়। হুবহু এক নয়, তবে এই ক্ষেত্রে Object#present?আরআর-তেও ভাল।
টোকল্যান্ড

এটি আসলে রুবি ২.৪ এ পাথের সাথে বিরতি! [43] (পিআর) # <রিঅ্যাক্টঅনরেলস :: অ্যাসেটসপ্রিম্পম্পাইল>: 0> সম্পদ_পথ.ব্ল্যাঙ্ক? সত্য [44] (প্রি) >: 0> সম্পদ_পথ.প্রসেন্ট? মিথ্যা [46] (পিআর) # <রিঅ্যাক্টঅনরেলস :: অ্যাসেটসপ্রিম্পম্পাইল>: 0> সম্পদ_পথ.নিল? ভুয়া
জাস্টিংফোর্ড

25

present?আপনার প্রশ্নের উত্তর হিসাবে উপস্থাপন করা অন্যান্য উত্তরগুলি থেকে সাবধান থাকুন ।

present?blank?রেল এর বিপরীত হয় ।

present?অর্থবহ মান আছে কিনা তা পরীক্ষা করে দেখুন। এই জিনিসগুলি একটি present?চেক ব্যর্থ করতে পারে :

"".present? # false
"    ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false

যেখানে একটি !nil?চেক দেয়:

!"".nil? # true
!"    ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true

nil?কোনও বস্তু আসলে আছে কিনা তা পরীক্ষা করে nil। আর কিছু: একটি খালি স্ট্রিং, 0, falseযাই হোক না কেন, নয় nil

present?খুব দরকারী, তবে অবশ্যই এর বিপরীত নয় nil?। দুটি বিভ্রান্তি অপ্রত্যাশিত ত্রুটি হতে পারে।

আপনার ব্যবহারের ক্ষেত্রে present?কাজ করবে তবে পার্থক্য সম্পর্কে সচেতন হওয়া বরাবরই বুদ্ধিমানের কাজ।


গৃহীত উত্তরের অন্তর্ভুক্ত করা উচিত। false.blank?হিসাবে হিসাবে একই নয়false.nil?
Yason

present?আপনার ডাটাবেসটি জিজ্ঞাসা nil?করবে,
টনি

17

হতে পারে এটি একটি পদ্ধতির হতে পারে:

class Object
  def not_nil?
    !nil?
  end
end

ভাল ধারণা. আমি এটি থেকে এটি যে কোন_নিল নেই? রুবিতে তবে এটি কি !self.nil?তখনকার মতো হওয়া উচিত নয় !nil?বা selfঅন্তর্নিহিত?
বার্কস

4
আপনার নিজের দরকার নেই। ইঙ্গিত করা হবে।
জিও

উদাহরণস্বরূপ পদ্ধতিগুলি (বা অ্যাক্সেসরগুলি, যা সত্যই নিখুঁত পদ্ধতি) থেকে পড়ার সময় স্বতন্ত্রিত হয়। মানগুলি সেট করার সময়, রুবি একই নামের একটি সেটার পদ্ধতির জন্য ক্লাস উদাহরণটি পরীক্ষা করার আগে পদ্ধতির স্থানীয় একটি ভেরিয়েবল তৈরি হবে। সাধারণ নিয়ম: আপনার যদি এক্সএক্সএক্স নামে একটি অ্যাট্রি_অ্যাক্সেসর থাকে তবে "সেলফ.এক্সএক্সএক্স = 3" (মান নির্ধারণ) বা "টেম্পে = এক্সএক্সএক্সএক্স" (মানটি পড়া) ব্যবহার করুন। "এক্সএক্সএক্সএক্স = 3" ব্যবহার করে অ্যাক্সেসর আপডেট হবে না, কেবল পদ্ধতির সুযোগে একটি নতুন ভেরিয়েবল তৈরি করুন।
একটি ফাদার অন্ধকার

5

আমি !পদ্ধতিটি থেকে ফলাফলটিতে রুবি-এস্ক পদ্ধতিটি উপস্থাপন করতে পারি nil?

def logged_in?
  user.nil?.!
end

এত বড় যে রুবিমাইন আইডিই এটিকে ত্রুটি হিসাবে চিহ্নিত করবে। ;-)


4

আপনি কেবল নিম্নলিখিতটি ব্যবহার করতে পারেন:

if object
  p "object exists"
else
  p "object does not exist"
end

এটি কেবল শূন্যের জন্যই নয়, মিথ্যা ইত্যাদির জন্যও কাজ করে না তাই আপনার ব্যবহারের ক্ষেত্রে এটি কার্যকর হয় কিনা তা পরীক্ষা করে দেখা উচিত।


2

আমি এই প্রশ্নে একটি অবজেক্ট পদ্ধতি অনুসন্ধান করে Symbol#to_procপৌঁছেছি , যাতে আমি কোনও ব্লকের পরিবর্তে শর্টহ্যান্ড ব্যবহার করতে পারি ; এর arr.find(&:not_nil?)চেয়ে কিছুটা বেশি পঠনযোগ্য আমি খুঁজে পাই arr.find { |e| !e.nil? }

আমি যে পদ্ধতিটি পেয়েছি তা হ'ল Object#itself। আমার ব্যবহারে, আমি কীটির জন্য একটি হ্যাশের মানটি খুঁজতে চেয়েছিলাম name, যেখানে কিছু ক্ষেত্রে সেই কীটি দুর্ঘটনাক্রমে মূলধন হিসাবে চিহ্নিত হয়েছিল Name। সেই ওয়ান-লাইনারটি নিম্নরূপ:

# Extract values for several possible keys 
#   and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)

অন্যান্য উত্তরে উল্লিখিত হিসাবে , আপনি যে ক্ষেত্রে বুলিয়ান পরীক্ষা করছেন সেখানে এটি দর্শনীয়ভাবে ব্যর্থ হবে।


কীভাবে এর থেকে আলাদা my_hash.values_at("Name", "name").find?
বার্কস

এটা ঠিক একই। আমার মূলটিতে আমার আরও কিছু যুক্তি ছিল mapযা আমি এই উদাহরণে সরলতার জন্য মুছে ফেলেছিলাম, তাই এখানে লিখিতভাবে এটির সাথে বিনিময়যোগ্য values_at। গুরুত্বপূর্ণ অংশটি যা পাস হয় find
আয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.