2

Ruby で作業しているプロジェクトでは、method_missing メソッドをオーバーライドして、ActiveRecord オブジェクトで変数を設定するのと同様に、このようなメソッド呼び出しを使用して変数を設定できるようにしています。

Object.variable_name= 'new value'

しかし、これを実装した後、多くの変数名にピリオド (.) が含まれていることがわかりました。私はこの回避策を見つけました:

Object.send('variable.name=', 'new value')

しかし、使用できるように期間をエスケープする方法があるのではないかと思っています

Object.variable.name= 'new value'

4

3 に答える 3

9

それをしないでください!

自分の言語で有効でない識別子を作成しようとするのは得策ではありません。本当にそのような変数を設定したい場合は、属性マクロを使用してください:

attr_writer :bar
attr_reader :baz
attr_accessor :foo

さて、警告を受けたので、次はその方法です。通常のアクセサーを取得するたびに同じクラスの別のインスタンスを返すだけで、必要な情報を収集できます。

class SillySetter
  def initialize path=nil
    @path = path
  end

  def method_missing name,value=nil
    new_path = @path ? "#{@path}.#{name}" : name
    if name.to_s[-1] == ?=
      puts "setting #{new_path} #{value}"
    else
      return self.class.new(path=new_path)
    end
  end
end

s = SillySetter.new
s.foo = 5              # -> setting foo= 5
s.foo.bar.baz = 4      # -> setting foo.bar.baz= 4

Ruby の愚かさを助長したくなかったのですが、どうしても我慢できませんでした。

于 2008-09-08T06:58:22.673 に答える
1

これを行う唯一の理由は、あなたの後にこのコードを維持しようとしている人が本当に嫌いな場合です。

そして、「彼が私の犬に轢かれた」という憎しみを意味しているわけではありません。

私は寺院の憎しみの本当の蒸し脈動静脈を意味します.

つまり、要するに、しないでください。:-)

于 2008-09-19T17:32:01.953 に答える
0

正規名を変更する見込みがない場合は、ゲッターとセッターに手動でエイリアスを設定できます。

def variable_name
 send 'variable.name'
end

def variable_name=(value)
 send 'variable.name=', value
end
于 2008-09-08T12:31:01.610 に答える