83

値をチェックして、値がゼロかゼロかを確認する簡潔な方法を探しています。現在、私は次のようなことをしています:

if (!val || val == 0)
  # Is nil or zero
end

しかし、これは非常に不器用に思えます。

4

22 に答える 22

72

オブジェクトにはnil がありますか? 方法

if val.nil? || val == 0
  [do something]
end

または、1 つの命令のみの場合:

[do something] if val.nil? || val == 0
于 2008-10-16T18:55:03.510 に答える
38

最後に疑問符が付いたメソッド名が本当に好きなら:


if val.nil? || val.zero?
  # do stuff
end

他のいくつかのソリューションと同様に、あなたのソリューションは問題ありません。

注意しないと、Ruby を使用すると、すべてを行うためのきれいな方法を検索するようになる可能性があります。

于 2008-11-07T19:18:04.737 に答える
30

まず、これがその特定の状態を確認できる最も簡潔な方法だと思います。

第二に、私にとってこれは、設計に潜在的な欠陥があることを示すコードの匂いです。一般に、nil と 0 は同じ意味ではありません。可能であれば、このコードを実行する前に、メソッドの開始時に確認するか、他のメカニズムで val が nil になる可能性を排除するようにしてください。

これを行う完全に正当な理由があるかもしれません。その場合、あなたのコードは良いと思いますが、少なくとも、可能であれば nil チェックを取り除こうとすることを検討したいと思います。

于 2008-10-16T17:35:04.280 に答える
9

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 への変更は同僚が追跡するのが難しく、コードが他の人にとって予測不能になる可能性があるため、これはお勧めしません。

于 2008-10-16T17:45:23.353 に答える
8

nil.to_i はゼロを返すので、私はよくこれを行います:

val.to_i.zero?

ただし、val が #to_i に応答しないオブジェクトである場合は、例外が発生します。

于 2009-11-06T19:49:24.073 に答える
4

あなたのコードは間違っていると思います。実際にはnilfalse、 、ゼロの 3 つの値をテストします。これは、!valfalse であるすべての値 (Ruby ではniland ) に対して式が true であるためfalseです。

私が今思いつくことができる最高のものは

if val == nil || val == 0
  # do stuff
end

もちろん、これはあまり賢いわけではありませんが、(非常に)明確です。

于 2008-10-16T17:30:59.887 に答える
2

できるだけ慣用的にするために、これをお勧めします。

if val.nil? or val == 0
    # Do something
end

なぜなら:

  • それはnilを使用しますか?方法。
  • || よりも好ましい "or" 演算子を使用します。
  • この場合は不要な括弧を使用しません。括弧は、特定の演算子の優先順位をオーバーライドするなど、何らかの目的を果たす場合にのみ使用してください。
于 2008-10-20T04:54:33.907 に答える
2

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

于 2008-10-16T17:46:16.800 に答える
0

「is?」を定義することでこれに対処します。このメソッドは、さまざまなクラスで異なる方法で実装できます。配列の場合、「は?」「サイズ>0」を意味します。Fixnum の場合、「self != 0」を意味します。String の場合、「self != ''」を意味します。もちろん、NilClass は「is?」を定義します。nilを返すだけです。

于 2008-10-16T21:31:35.970 に答える
0

必要に応じて使用でき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

もちろん、正しいことは、メソッドまたは関数を定義することです。または、同じことを多くの値で行う必要がある場合は、これらの優れたイテレータを組み合わせて使用​​します。

于 2009-01-25T23:44:59.747 に答える
0

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
于 2010-02-13T14:31:31.587 に答える
0

これは非常に簡潔です。

if (val || 0) == 0
  # Is nil, false, or zero.
end

falseと同じように扱ってもかまわない限り、それは機能しますnil。私が取り組んできたプロジェクトでは、その区別が重要になるのはたまにしかありません。残りの時間はスキップ.nil?して、コードを少し短くすることを個人的に好みます。

[更新: もうこの種のことは書きません。機能しますが、不可解すぎます。私が行ったいくつかの場所を変更することで、自分の悪行を正そうとしました。]

ちなみに、文字列の.zero?場合は例外が発生するため、使用しませんでしvalた。しかし、.zero?そうではないことを知っていれば問題ありません。

于 2014-09-25T16:32:52.407 に答える
-1

別の解決策:

if val.to_i == 0
  # do stuff
end
于 2009-01-26T15:40:32.983 に答える
-3
val ||= 0
if val == 0
# do something here
end
于 2008-11-05T00:15:54.183 に答える