9

他のタイプの変数には を使用します||=が、これはブール値では機能しません ( x ||= truex が以前に false に割り当てられていたとしても、x を true に割り当てます)。

私はこれがうまくいくと思っていました:

x = true unless defined?(x)

しかし、そうではありません。何らかの理由で x を nil に割り当てます。(ここで説明をいただければ幸いです。)

私は機能する1つの方法を知っています:

unless defined?(x)
  x = true
end

しかし、それはかなり冗長です。Rubyでブール変数にデフォルト値を割り当てるより簡潔な方法はありますか?

4

3 に答える 3

12

そうしないと、パーサーが到達し、実行する前にdefined? 定義x =しますx(これにより、が作成されます) :nilunless

defined?(x) or x = true
x  #=> true
x = false
defined?(x) or x = true
x  #=> false

if/unlessブロック (ポスト / ワンライナーの代わりに)ifunless実行することも機能します。

unless defined?(x)
  x = true
end
x  #=> true
x = false
unless defined?(x)
  x = true
end
x  #=> false
于 2012-11-09T05:22:22.793 に答える
3

Rubyにはtrueでない値が2 つしかありません:falsenil. あなたがする必要があるのは、それらを区別することだけです。これを自動的に行う新しい//=オペレーターが登場するまで、あなたはこれで立ち往生しています:

if (x.nil?)
  x = true
end

うまくいけば、これは Ruby の将来のバージョンで省略される可能性があります。99% の場合、真でない 2 つの値の違いをあまり気にしませんが、その 1% の場合は、異常に冗長である必要があることに煩わされます。

変数はローカル変数として「定義」されているため、演算子は常にその条件defined?を返すことに注意してください。と対比すると、その変数が存在しないため取得できます。Ruby は、その変数または定数が値で定義されているかどうかではなく、問題の変数または定数に関心があります。"local-variable"xdefined?(nope)nil

于 2012-11-09T05:01:55.210 に答える
-1
x = defined?(x) ? true  : false
于 2012-11-09T07:11:23.307 に答える