値をチェックして、値がゼロかゼロかを確認する簡潔な方法を探しています。現在、私は次のようなことをしています:
if (!val || val == 0)
# Is nil or zero
end
しかし、これは非常に不器用に思えます。
値をチェックして、値がゼロかゼロかを確認する簡潔な方法を探しています。現在、私は次のようなことをしています:
if (!val || val == 0)
# Is nil or zero
end
しかし、これは非常に不器用に思えます。
オブジェクトにはnil がありますか? 方法。
if val.nil? || val == 0
[do something]
end
または、1 つの命令のみの場合:
[do something] if val.nil? || val == 0
最後に疑問符が付いたメソッド名が本当に好きなら:
if val.nil? || val.zero?
# do stuff
end
他のいくつかのソリューションと同様に、あなたのソリューションは問題ありません。
注意しないと、Ruby を使用すると、すべてを行うためのきれいな方法を検索するようになる可能性があります。
まず、これがその特定の状態を確認できる最も簡潔な方法だと思います。
第二に、私にとってこれは、設計に潜在的な欠陥があることを示すコードの匂いです。一般に、nil と 0 は同じ意味ではありません。可能であれば、このコードを実行する前に、メソッドの開始時に確認するか、他のメカニズムで val が nil になる可能性を排除するようにしてください。
これを行う完全に正当な理由があるかもしれません。その場合、あなたのコードは良いと思いますが、少なくとも、可能であれば nil チェックを取り除こうとすることを検討したいと思います。
Object.nil を使用できますか? 具体的に nil をテストします (false と nil の間で巻き込まれないようにします)。メソッドを Object にモンキー パッチすることもできます。
class Object
def nil_or_zero?
return (self.nil? or self == 0)
end
end
my_object = MyClass.new
my_object.nil_or_zero?
==> false
Object への変更は同僚が追跡するのが難しく、コードが他の人にとって予測不能になる可能性があるため、これはお勧めしません。
nil.to_i はゼロを返すので、私はよくこれを行います:
val.to_i.zero?
ただし、val が #to_i に応答しないオブジェクトである場合は、例外が発生します。
あなたのコードは間違っていると思います。実際にはnil
、false
、 、ゼロの 3 つの値をテストします。これは、!val
false であるすべての値 (Ruby ではnil
and ) に対して式が true であるためfalse
です。
私が今思いつくことができる最高のものは
if val == nil || val == 0
# do stuff
end
もちろん、これはあまり賢いわけではありませんが、(非常に)明確です。
できるだけ慣用的にするために、これをお勧めします。
if val.nil? or val == 0
# Do something
end
なぜなら:
Rails は、false と nil に加えて、0 と "" も false に評価される属性クエリ メソッドを介してこれを行います。
if (model.attribute?) # => false if attribute is 0 and model is an ActiveRecord::Base derivation
しかし、それは中傷者のシェアを持っています。http://www.joegrossberg.com/archives/002995.html
「is?」を定義することでこれに対処します。このメソッドは、さまざまなクラスで異なる方法で実装できます。配列の場合、「は?」「サイズ>0」を意味します。Fixnum の場合、「self != 0」を意味します。String の場合、「self != ''」を意味します。もちろん、NilClass は「is?」を定義します。nilを返すだけです。
必要に応じて使用できcase
ます:
case val with nil, 0
# do stuff
end
そうすれば、 で動作するものなら何でも使用できます===
。または、次のようにします。
not_valid = nil, 0
case val1 with *not_valid
# do stuff
end
#do other stuff
case val2 with *not_valid, false #Test for values that is nil, 0 or false
# do other other stuff
end
これは正確に優れた OOP ではありませんが、非常に柔軟で機能します。とにかく、私if
の s は通常s になります。case
もちろんEnum.any?
/Enum.include?
ある種の作品も...本当に不可解になりたい場合:
if [0, nil].include? val
#do stuff
end
もちろん、正しいことは、メソッドまたは関数を定義することです。または、同じことを多くの値で行う必要がある場合は、これらの優れたイテレータを組み合わせて使用します。
blank?
そういう意味ではRailsのメソッドが好きなんtrue
ですが、 0
. したがって、メソッドを追加できます:
def nil_zero?
if respond_to?(:zero?)
zero?
else
!self
end
end
そして、いくつかの値が nil か 0 かをチェックします:
nil.nil_zero?
=> true
0.nil_zero?
=> true
10.nil_zero?
=> false
if val.nil_zero?
#...
end
これは非常に簡潔です。
if (val || 0) == 0
# Is nil, false, or zero.
end
false
と同じように扱ってもかまわない限り、それは機能しますnil
。私が取り組んできたプロジェクトでは、その区別が重要になるのはたまにしかありません。残りの時間はスキップ.nil?
して、コードを少し短くすることを個人的に好みます。
[更新: もうこの種のことは書きません。機能しますが、不可解すぎます。私が行ったいくつかの場所を変更することで、自分の悪行を正そうとしました。]
ちなみに、文字列の.zero?
場合は例外が発生するため、使用しませんでしval
た。しかし、.zero?
そうではないことを知っていれば問題ありません。
別の解決策:
if val.to_i == 0
# do stuff
end
val ||= 0
if val == 0
# do something here
end