পরিবর্তনশীল শূন্য নয় এবং রুবিতে শূন্য নয় কিনা তা পরীক্ষা করা হচ্ছে


271

আমি ভেরিয়েবলটি শূন্য এবং শূন্য নয় কিনা তা পরীক্ষা করতে নীচের কোডটি ব্যবহার করছি

if(discount != nil && discount != 0) 
  ...
end

এই কাজ করতে একটি ভাল উপায় আছে কি?


1
সম্ভবত কারণ এটি স্ট্যাকওভারফ্লো . com / জিজ্ঞাসাগুলি / 209495/ … এর সঠিক কপি ।
ডেভিড নেহমে

1
discountমিথ্যা হলে কী করা উচিত ?
অ্যান্ড্রু গ্রিম

1
আমি মনে করি discount.in? [0, nil]পরিষ্কার
উপায়টি

উত্তর:


428
ছাড়.নিল না হলে? || ছাড় == 0
  # ...
শেষ

31
|| এর পরিবর্তে 'বা' ব্যবহার করুন
অরিওন এডওয়ার্ডস

93
@ ওরিওন-এডওয়ার্ডস কেন?
নারকোজ

39
'বা' ব্যবহার করা বিপজ্জনক। 'বা' এর তুলনায় '=' এর তুলনায় নিম্নতর অপারেটর উপস্থিতি রয়েছে: সুতরাং নিম্নলিখিতটির অপ্রত্যাশিত আচরণ রয়েছে: a = মিথ্যা বা সত্য # ক এই বিবৃতি দেওয়ার পরে মিথ্যা
টম জি

20
@ xiy বর্তমানে গাইডটি ভান করার সুপারিশ করেছে এবং এবং এর অস্তিত্ব নেই (||
সেটাই কি &&&

67
বর্তমান "রুবি স্টাইল গাইড" দাঁড়িয়েছে The and and or keywords are banned. It's just not worth it. Always use && and || instead.। এবং এটা ঠিক, ডেভিড এবং টম কারণে।
আন্দ্রে ফিগুয়েরেদো

40
class Object
  def nil_zero?
    self.nil? || self == 0
  end
end

# which lets you do
nil.nil_zero? # returns true
0.nil_zero?   # returns true
1.nil_zero?   # returns false
"a".nil_zero? # returns false

unless discount.nil_zero?
  # do stuff...
end

সাধারণ অস্বীকারকারীদের থেকে সাবধান থাকুন ... দুর্দান্ত শক্তি / দায়িত্ব, বানরের প্যাচিং অন্ধকার দিকের দিকে নিয়ে যাওয়া ইত্যাদি


28

ঠিক আছে, 5 বছর কেটে যাওয়ার পরে ...

if discount.try :nonzero?
  ...
end

tryঅ্যাক্টিভসপোর্ট রত্নটিতে এটি সংজ্ঞায়িত করা গুরুত্বপূর্ণ , তাই এটি সরল রুবিতে উপলভ্য নয়।


7
দ্রষ্টব্য যে এটি একটি রেল-নির্দিষ্ট উত্তর। ভ্যানিলা রুবীর কোনও tryপদ্ধতি নেই।
টম লর্ড

সঠিক। যদিও এটি অ্যাক্টিভসপোর্ট-নির্দিষ্টের মতো, এটি সম্পূর্ণ রেলের চেয়ে অনেক বেশি হালকা এবং বহুল ব্যবহৃত নির্ভরতা। যাইহোক এখন @ এনডিএন এর প্রতিক্রিয়া সঠিক।
পুনর্লিখিত

নিরাপদ গৌণ ব্যবহার করতে সম্পাদিত
পুনর্লিখিত

1
উত্তর এখন নকল করে স্ট্যাকওভারফ্লো . com/a/34819818/1954610 ... আমি মনে করি tryবিকল্প বিকল্প প্রদর্শন করার জন্য এটি ছেড়ে দেওয়ার কোনও মূল্য রয়েছে (এটি এ কারণেই এটি প্রথম স্থানে উন্নীত হয়েছিল!), যতক্ষণ না এটি পরিষ্কার হয়ে যায় যে পাঠক ActiveSupportভ্যানিলা রুবি নয়।
টম লর্ড

পয়েন্ট নেওয়া, উত্তর ঘূর্ণিত।
পুনরায়

27
[শূন্য, 0] না হলে। অন্তর্ভুক্ত? (ছাড়) 
  # ...
শেষ

13
সুন্দর? হ্যাঁ. রিডেবল? আসলে তা না.
এল নিনজা ট্রেপাডোর

1
আমি এটিকে নিখুঁতভাবে পঠনযোগ্য বলে মনে করি এবং আমি এটি একটি নতুন শ্রেণির চেয়ে বেশি পছন্দ করি। সাবাশ.
কলিঙ্কার

দুটি শর্ত পরিচালনা করার সর্বাধিক রুবিবাদী পদ্ধতি।
ইউজেন্দ্রান

23

রুবি ২.৩.০ থেকে, আপনি নিরাপদ নেভিগেশন অপারেটর ( &.) এর সাথে একত্রিত করতে পারেন Numeric#nonzero?&.ফেরৎ nilযদি উদাহরণস্বরূপ ছিল nilএবং nonzero?- যদি সংখ্যা ছিল 0:

if discount&.nonzero?
  # ...
end

বা পোস্টফিক্স:

do_something if discount&.nonzero?

"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... এটি নির্বিচারে অবজেক্টগুলিতে ব্যবহার করা নিরাপদ নয়।
টম লর্ড

2
@ টমলর্ড, আগের মন্তব্যে যেমন বলা হয়েছে, এটি স্বেচ্ছাচারী বস্তুগুলির সাথে কাজ করার উদ্দেশ্য নয়। পরিবর্তে এটি মামলার সাথে সম্পর্কিত যখন আপনার কাছে এমন কিছু রয়েছে যা আপনি জানেন একটি নম্বর হওয়া উচিত, তবে এটিও হতে পারে nil
ndnenkov

কেউ এটিকে স্কিম-পড়া এবং মন্তব্যে অস্বীকৃতি দান না করে উত্তরে আমি সেই সত্যটি পরিষ্কার করে দেব।
টম লর্ড

@ টমলর্ড, উত্তরে এটি বর্ণিত হয়েছে " nonzero?- যদি সংখ্যাটি ছিল 0" । এছাড়াও একটি সম্পূর্ণ স্বেচ্ছাচারিত বস্তু 0খুব কমই উত্থাপিত হয়েছে কিনা তা যাচাই করার প্রয়োজনটি তুলনামূলকভাবে খুব কমই ঘটেছিল এমন একটি সংখ্যা যা কিনা হতে পারে বা না পরীক্ষা করতে পারে nil। সুতরাং এটি প্রায় নিহিত। এমনকি যদি কেউ কোনওভাবে বিপরীত ধারণাটি তৈরি করেও, তারা যখন তা কার্যকর করার চেষ্টা করবে তখন তারা তাত্ক্ষণিকভাবে বুঝতে পারবে।
ndnenkov


15

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

if (!discount.nil? && !discount.zero?)

অর্ডার এখানে গুরুত্বপূর্ণ, কারণ যদি discountহয় nil, তবে এটির কোনও zero?পদ্ধতি থাকবে না । রুবির সংক্ষিপ্ত সার্কিট মূল্যায়ন এটি discount.zero?যদি discountহয় তবে তা মূল্যায়নের চেষ্টা করা থেকে বিরত করা উচিত nil


11

আপনি আপনার খালি সারিটি পূর্ণসংখ্যার মানতে রূপান্তর করতে এবং শূন্যটি পরীক্ষা করতে পারেন?

"".to_i.zero? => true
nil.to_i.zero? => true

সাবধান: 0.1.to_i == 0
সাইমন বি।

3
if discount and discount != 0
  ..
end

আপডেট, এটা করবে না falseজন্যdiscount = false


2

আপনি NilClassপ্রদত্ত #to_iপদ্ধতির সুবিধা নিতে পারেন , যা nilমানগুলির জন্য শূন্য ফিরে আসবে :

unless discount.to_i.zero?
  # Code here
end

যদি discountভগ্নাংশের সংখ্যা হতে পারে তবে আপনি তার #to_fপরিবর্তে ব্যবহার করতে পারেন , সংখ্যাটি শূন্য থেকে গোল করা থেকে বিরত রাখতে।


এটি কি @ oivoodo এর উত্তরের মতো নয়?
ক্যারি সোভেল্যান্ড

স্বেচ্ছাসেবী বস্তুর জন্য কাজ করে না"".to_i == "foo".to_i == "0".to_i == 0। আপনার পদ্ধতিটি সমস্ত ধরণের অযৌক্তিক ধরণের জোর করে তোলে। সাড়া না NoMethodErrorদিলে এটিও ব্যর্থ হবে । discountto_i
টম লর্ড

2
def is_nil_and_zero(data)
     data.blank? || data == 0 
end  

আমরা যদি পাস করি তবে এটি ফাঁকা থাকলেও মিথ্যা ফিরে আসবে? সত্য ফিরে। ডেটা = মিথ্যা ফাঁকা থাকলে একই অবস্থা? শূন্য, মিথ্যা, খালি, বা একটি সাদা স্থানের স্ট্রিংয়ের জন্য সত্য ফিরে আসে। তাহলে খালি ব্যবহার করা ভাল? খালি স্ট্রিং এড়াতে পদ্ধতি।


1
blank?রেল-নির্দিষ্ট পদ্ধতি, এবং ভ্যানিলা রুবিতে পাওয়া যায় না।
টম লর্ড

আপনি সঠিক!! আমি ভেবেছিলাম যে এটি এখানে পোস্ট করা "রর" ট্যাগের সাথে সম্পর্কিত। আমার ভুল. এটি ভ্যানিলা রুবিতে কাজ করবে না।
সরোজ

1

একটি ডাটাবেস রেকর্ডের সাথে কাজ করার সময়, মাইগ্রেশন সহায়ক ব্যবহার করে আমি 0 দিয়ে সমস্ত খালি মান শুরু করতে চাই:

add_column :products, :price, :integer, default: 0

0

আপনার কোডটি যতক্ষণ না শুরু করার আগে এটি ব্যবহার করার চেষ্টা এবং ব্যবহার না করার গ্যারান্টিযুক্ত যতক্ষণ আপনি 0 তে ছাড় শুরু করতে পারেন। আমি মনে করি এটি একটি চেক সরিয়ে ফেলবে, আমি অন্য কিছু ভাবতে পারি না।



0

আমি আরও ক্লিনার পদ্ধতির ব্যবহার পছন্দ করি:

val.to_i.zero?

val.to_iএকটি ফিরে আসবে 0যদি Val একটি হল nil,

এর পরে, আমাদের যা করতে হবে তা হ'ল চূড়ান্ত মানটি একটি শূন্য কিনা ।


-1

বিকল্প সমাধান হ'ল পরিশোধনগুলি যেমন ব্যবহার করা হয়:

module Nothingness
  refine Numeric do
    alias_method :nothing?, :zero?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

if discount.nothing?
  # do something
end

-7

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

if discount != 0
end

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