4

古いバージョンの Ruby では、代入の結果が属性設定メソッドによって返される値だった理由を誰かが説明したいと思いますが、Ruby 1.8 以降では、代入の値は常にパラメーターの値になります。メソッドの戻り値は破棄されます。次のコードでは、Ruby の古いバージョンでは結果が 99 に設定されていましたが、結果は 2 に設定されます。

class Test
  def val=(val)
    @val = val
    return 99
  end
end

t = Test.new
result = (t.val = 2)
result # => 2

この変更の背後にある理由は何でしたか?

4

2 に答える 2

2

割り当ては、常に割り当てられた値に評価されます。これはシンプルで一貫したルールであり、 Ruby 自体ので一貫しているだけでなく、他のほとんどの式ベースのプログラミング言語とも一貫しています。

それ以外は一貫性のない特殊なケースであり、それらは悪いことです。

于 2013-04-09T00:55:25.823 に答える
2

複数の変数に同じ値を割り当てたい場合、代入を連鎖させることは珍しくありません。これは、他の言語ではさらに一般的です。

@user_id = user.id = next_user_id

しかし、それについて考えていないために、戻り値が入力値と同じでない場合はどうなるでしょうか。

class User
  def id=(name)
    @id = name
    @modified = true
  end

  def modified?
    @modified
  end
end

このコードは、ある日、上記のような割り当てチェーンにドロップするまではまったく問題なく機能しますが、突然予期しない結果が得られます。

したがって、インタープリターはある種のブードゥーを行い、割り当ての右辺が戻り値であることを確認し、実際の戻り値を破棄します。

于 2013-04-09T02:17:19.137 に答える