1. ホーム
  2. ruby

[解決済み] 動的な定数割り当て

2022-02-18 20:31:49

質問

class MyClass
  def mymethod
    MYCONSTANT = "blah"
  end
end

がエラーになります。

SyntaxError: 動的定数代入エラー

なぜこれが動的定数とみなされるのでしょうか?文字列を代入しているだけなのですが。

どのように解決するのですか?

あなたの問題は、メソッドを実行するたびに、定数に新しい値を代入していることです。これは定数を非定数にするものであり、許されることではありません。 内容 の文字列は(今のところ)同じですが、実際の文字列は オブジェクト は、このメソッドが呼ばれるたびに異なります。例えば

def foo
  p "bar".object_id
end

foo #=> 15779172
foo #=> 15779112

なぜメソッド内の定数の値を変更したいのか、その使用例を説明していただければ、よりよい実装のお手伝いができるかもしれません。

もしかしたら、クラスのインスタンス変数の方がいいのでは?

class MyClass
  class << self
    attr_accessor :my_constant
  end
  def my_method
    self.class.my_constant = "blah"
  end
end

p MyClass.my_constant #=> nil
MyClass.new.my_method

p MyClass.my_constant #=> "blah"

もし、あなたが 本当に メソッドの中で定数の値を変更したい場合、定数が文字列あるいは配列であれば、 「ごまかす」ことができます。 #replace メソッドを使用すると、オブジェクトを実際に変更することなく、新しい値を取得することができます。

class MyClass
  BAR = "blah"

  def cheat(new_bar)
    BAR.replace new_bar
  end
end

p MyClass::BAR           #=> "blah"
MyClass.new.cheat "whee"
p MyClass::BAR           #=> "whee"