2

thisthisを含むいくつかのことを読みましたが、以下の例は彼らが話していることとは異なると思います。実際、ある人が議論の中で同様の例を挙げていますが、無視されています。

したがって、irb で実行します (条件の代入に関する警告は無視してください)。

(puts x) if (x = 0) # NameError: undefined local variable or method `x'...
x                   # => 0
(puts x) if (x = 0) # "0", => nil

しかし、2回目はエラーがありません。

これは、「パーサーが実際に何をしているかを理解し、これがいくつかの最適化にすぎないことを理解すると、すべてが明確になる」ような方法でも意味がありますか? 私には、それはかなり望ましくないように思えるからです。

明確にするために、上記の条件式は同等である必要があります(正しいですか?)

if newvar=0
  puts newvar
end

これはエラーを発生させません。


更新: この質問がされてから、このトピックに関する投稿がさらに増えました。例
: http://seejohncode.com/2012/07/31/ruby-gotcha-single-line-conditionals/

4

4 に答える 4

1

奇妙なことに、これは Rubinius で問題なく動作します。

Welcome to IRB. You are using rubinius 1.2.4dev (1.8.7 7ae451a1 yyyy-mm-dd JI)
>> (puts x) if (x = 0) #=> nil
0

これは MRI の奇妙な構文解析バグだと言いたいところです。

于 2011-08-12T06:34:45.927 に答える
1

この場合の違いは、行を解析するときに変数が存在するかどうかだと思います。の場合:

if x=0
  puts x
end

変数 x は、x を使用する行を解析する前に定義されます。

つまり、エラー メッセージは解析時エラーであり、実行時エラーではありません。

于 2011-08-12T09:23:55.917 に答える
0

これで x に 0 を代入していると思います。

(puts x) if (x = 0)

そうあるべきだと思う

(puts x) if (x == 0)
于 2011-08-12T06:22:22.297 に答える
0

x=0まず、条件節の意味を確認してください。

第二に、puts x if x = 0以下と同等ではありません:

if x = 0
  puts x
end

あなたの場合、 x はまだ宣言されていないputs xため、表示できません。

于 2011-08-12T06:38:02.303 に答える