4

破壊的なメソッドをチェーンして変数の値を1つ変更する方法をルビーで探していますが、というエラーが発生しますCan't change the value of self。これはRubyでは不可能なことですか?

guesses_left = 3

class Integer
  def decrement_guess_count!
    self -= 1
  end
end

guesses_left.decrement_guess_count!
4

1 に答える 1

10

これは仕様によるものです。これは整数に固有のものではなく、すべてのクラスがそのように動作します。一部のクラス(たとえば)では、インスタンスの状態Stringを変更できますが(これは破壊的操作と呼ばれます)、オブジェクトを完全に置き換えることはできません。整数の場合、状態さえも変更できません。整数はありません。

もし私たちがそのようなことを喜んで許すなら、それはたくさんの難しい質問を提起するでしょう。たとえば、参照をfoo参照している場合bar1は、これをに置き換えますbar2foo指さし続ける必要がありbar1ますか?なんで?なぜそうすべきではないのですか?bar2タイプが完全に異なる場合、のユーザーはbar1これにどのように対応する必要がありますか?等々。

class Foo
  def try_mutate_into another
    self = another
  end
end


f1 = Foo.new
f2 = Foo.new

f1.try_mutate_into f2
# ~> -:3: Can't change the value of self
# ~>         self = another
# ~>               ^

この操作が可能な言語を見つけるようにあなたに挑戦します。:)

于 2013-02-05T17:13:00.053 に答える