次のコードを使用して、変数がnilでもゼロでもないかどうかを確認しています
if(discount != nil && discount != 0)
...
end
これを行うより良い方法はありますか?
discount
falseの場合はどうすればよいですか?
discount.in? [0, nil]
クリーンな方法が可能だと思います
次のコードを使用して、変数がnilでもゼロでもないかどうかを確認しています
if(discount != nil && discount != 0)
...
end
これを行うより良い方法はありますか?
discount
falseの場合はどうすればよいですか?
discount.in? [0, nil]
クリーンな方法が可能だと思います
回答:
discount.nilでない限り?|| 割引== 0 #... 終わり
The and and or keywords are banned. It's just not worth it. Always use && and || instead.
です。デビッドとトムの理由から、それは正しいです。
わかりました、5年が経過した後...
if discount.try :nonzero?
...
end
try
はActiveSupport gemで定義されているため、プレーンルビでは使用できないことに注意してください。
try
メソッドがありません。
try
/ a / 34819818/1954610 と重複しています... 代替オプションを示すためにそのままにしておくことには価値があると思います(これが最初から支持されていた理由です!)。ActiveSupport
バニラルビーではない読者。
[nil、0] .include?(discount)以外 #... 終わり
Ruby 2.3.0以降では、セーフナビゲーション演算子(&.
)をと組み合わせることができますNumeric#nonzero?
。インスタンスが次の場合はを&.
返します-数が次の場合:nil
nil
nonzero?
0
if discount&.nonzero?
# ...
end
または後置:
do_something if discount&.nonzero?
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String
....これは、任意のオブジェクトで使用するのは安全ではありません。
nil
。
nonzero?
-あれば数はでした0
」。また、完全に任意のオブジェクトが存在0
するかどうかを確認する必要性は、そうでない可能性があるかどうかに関係なく、数を確認する場合と比較して非常にまれに発生しますnil
。したがって、それはほとんど暗示されています。誰かが何らかの理由で逆の仮定を行ったとしても、彼らはそれを実行しようとしたときに何が起こっているかを即座に理解します。
NilClass
提供された#to_i
メソッドを利用できます。これはnil
値に対してゼロを返します。
unless discount.to_i.zero?
# Code here
end
discount
が小数の場合は、#to_f
代わりにを使用して、数値がゼロに丸められないようにすることができます。
"".to_i == "foo".to_i == "0".to_i == 0
。このメソッドは、あらゆる種類の意図しない型の強制変換を行います。NoMethodError
if discount
が応答しない場合も失敗しto_i
ます。
def is_nil_and_zero(data)
data.blank? || data == 0
end
「」を渡すと、空白であるのにfalseを返しますか?trueを返します。data = falseの場合も同じです。nil、false、空、または空白文字列に対してtrueを返します。だからブランクを使う方がいいですか?空の文字列も回避するメソッド。
blank?
はレール固有のメソッドであり、バニラ・ルビーでは使用できません。
if discount.nil? || discount == 0
[do something]
end
別の解決策は、次のように絞り込みを使用することです。
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
Rubyコードには次のコードで十分だと思います。これとオリジナルの違いを示す単体テストを書くことはできないと思います。
if discount != 0
end
true
割引があったかどうかを評価しnil
ます。