1

この単純なコードを考えると:

class Yeah
  attr_reader :foo
  attr_reader :fool
  attr_reader :feel
  def initialize(foo: "test", fool: {}, feel: [])
    @foo = foo
    @fool = fool
  end
end

test = Yeah::new
pp test
test.fool[:one] = 10
pp test

出力:

#<Yeah:0x000008019a84a0 @foo="test", @fool={}>
#<Yeah:0x000008019a84a0 @foo="test", @fool={:one=>10}>

私の質問は、実際の読み取り専用配列、ハッシュ属性への読み取りアクセサを行うための「シンプルな」「クリーンな」方法があるか、書き込みが困難なロックがたくさんある配列またはハッシュを継承する必要がある (undef、alias) またはこのようなプロキシ、デリゲート、またはその他のパタ​​ーンを使用していますか?

4

3 に答える 3

1

私はこの解決策を一般化し、「悪」の評価を防ぎたいので:

私は最終的に、Arupソリューションからこれに到達しました:

class Module
  def attr_readonly *syms
    syms.each do |method|
      define_method(method){
        return self.instance_variable_get("@#{method.to_s}").dup.freeze 
      }
    end
  end
end

class Yeah

  attr_reader :foo
  attr_readonly :fool
  attr_reader :feel
  def initialize(foo: "test", fool: {}, feel: [])
    @foo = foo
    @fool = fool
    @feel = feel
  end

end
于 2013-10-18T11:07:05.320 に答える