9

私はいつもこの Ruby の問題に直面しています。もっときれいに書きたいと思っています。

var a can be nil
a.value can also be nil
a.value has possible true or false value

if (not a.nil?) && (not a.value.nil?) && a.value == false
  puts "a value is not available"
else
  puts "a value is true"
end

問題は、条件ステートメントがぎこちなくて読みにくいことです。nilチェックとfalse条件ステートメントを改善するにはどうすればよいですか?

ありがとう、私はRubyの初心者です

4

6 に答える 6

20

tryRuby on rails には、次のように記述できるという拡張機能があります。

 if a.try(:value) == false

とてもきれいです。なしtryで、あなたはただ書くことができます

 if a && a.value == false

nil の場合a.valueは false ではないため、問題ありません:)

が定義されていない可能性がある場合a.value(例外が発生します)、次のように記述します。

if a && a.respond_to?(:value) && a.value == false

[更新: ruby​​ 2.3 以降]

ruby 2.3 以降、さらに短いバージョンがあります。

if a&.value == false

これはほぼ同等ですa.try(:value)(ただし、純粋なルビーです)。違い:

  • valueが存在しない場合、オペレーター&.はスローし、try単に nil を返します (望ましいかどうか?)(注意:try!スローもします)。
  • カスケードするとき、tryまたは&.それらの処理もfalse異なります。これは前の違いから論理的に続き、trynil を返しますが、メソッドを知らない&.ためスローしfalseます :P
于 2013-07-25T07:48:54.333 に答える
2
  if a && a.value!=false
     puts "a value is true"
  else
     puts "a value is not available"         
  end


  or just 

  puts a && a.value!=false ? "a value is true" : "a value is not available"
于 2013-07-25T07:32:59.663 に答える
1

最も簡単でクリーンな方法は、裏返して裏返すことです。truthy値ではなく値falseyを確認する

if a && a.value
  puts "a value is true"
else
  puts "a value is not available"
end

もちろん、またはRailsを使用してどちらの方法でも実行できますblank?present?

于 2016-04-30T22:20:05.027 に答える
0

あなたの状態は冗長です。である場合a.valueは、そうfalseではありませんnil

if a.nil?.! && a.value == false
  puts "a value is not available"
else
  puts "a value is true"
end
于 2013-07-25T07:36:40.360 に答える
0

これは常にブール値を返します。nil の場合は false を返します。false の場合は false を返します。true の場合は true を返します。それを試してみてください、それは素晴らしくて短いです:

!!a.try(:value) == false

于 2015-11-17T11:13:26.727 に答える