7

aが未定義の場合a || 1、エラーがスローされますが、スローされa = a || 1ません。ちょっと矛盾してない?

irb(main):001:0> a
NameError: undefined local variable or method 'a' for main:Object
        from (irb):1
        from c:/ruby/bin/irb:12:in '<main>'

irb(main):002:0> a || 1
NameError: undefined local variable or method 'a' for main:Object
        from (irb):2
        from c:/ruby/bin/irb:12:in '<main>'

irb(main):003:0> a = a || 1
=> 1
4

3 に答える 3

9
a

ここでaは、定義されていない を評価しています。したがって、例外が発生します。

a || 1

ここでもa、ブール式の値を決定するために評価する必要があります。上記のように、a定義されていません。したがって、例外が発生します。

a = a || 1

ここで、a 定義されています。初期化されていないローカル変数として定義されています。Ruby では、初期化されていない変数は に評価されるnilため、代入式の右側は にnil || 1評価され、代入式1の戻り値は に1なり、副作用は にa初期化され1ます。

編集: 変数がいつ定義され、いつ Ruby で初期化されるかについて混乱があるようです。get は解析時に定義されますが、実行時に初期化されます。ここで見ることができます:

 foo # => NameError: undefined local variable or method `foo' for main:Object

foo未定義です。

if false
  foo = 'This will never get executed'
end

この時点でfooは定義されていますが、行は決して実行されません。行が実行されないという事実はまったく無関係です。インタープリターはこれとは何の関係もないからです: ローカル変数はパーサーによって定義され、パーサーは明らかにこの行を認識します。

foo # => nil

fooが定義されているためエラーは発生せず、初期化されnilていないため と評価されます。

于 2010-06-06T09:12:57.823 に答える
1

を実行すると、未定義a || 1の値を探すように求められます。a

あなたがそうするとき、エラーを与えないように見えるa = a || 1割り当ての値を探すようにそれを求めています。aa

したがって、奇妙ではありますが、矛盾しているとは思いません。

于 2010-06-06T07:08:18.763 に答える
0

これはあなたが意味するものですか?

if !(defined? a) then
    a = 1
end

1 をデフォルトとして値を宣言する方が簡単かもしれません。

于 2010-06-06T07:11:16.247 に答える