ruby - 如何增强 ruby​​ 中的 attr_accessor?

标签 ruby attributes metaprogramming attr-accessor

我想实现一个(类)方法 attr_accessor_with_client_reset,它与 attr_accessor 做同样的事情,但它在每个 writer 上额外执行

@client = nil

例如,

attr_accessor_with_client_reset :foo

应该产生与

相同的结果
attr_reader :foo

def foo=(value)
  @foo = value
  @client = nil
end

我如何实现这一目标?

最佳答案

Sergio 的解决方案很好,但不必要地复杂:无需复制 attr_reader 的行为,您只需委托(delegate)给它即可。并且不需要所有这些双模块都包含 hook hackery。另外,attr_accessor 有多个名称,所以 attr_accessor_with_client_reset 也应该。

module AttrAccessorWithClientReset
  def attr_accessor_with_client_reset(*names)
    attr_reader *names

    names.each do |name|
      define_method :"#{name}=" do |v|
        instance_variable_set(:"@#{name}", v)
        @client = nil
      end
    end
  end
end

class Foo
  extend AttrAccessorWithClientReset

  attr_reader :client
  def initialize
    @foo = 0
    @client = 'client'
  end

  attr_accessor_with_client_reset :foo
end

f = Foo.new
f.foo    # => 0
f.client # => "client"
f.foo = 1
f.foo    # => 1
f.client # => nil

关于ruby - 如何增强 ruby​​ 中的 attr_accessor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410391/

相关文章:

xcode - 像 zip 一样组合文件夹和文件

c# - 如何在编译时检索泛型基类的参数? (即不使用反射)

c++ - 引用模板元编程

model-view-controller - 如何使用属性路由使 ASP.NET MVC 5 区域显示为站点根目录

android - View 属性的数据绑定(bind)错误

metaprogramming - Boo 元编程和可扩展性功能的指南?

ruby-on-rails - 在 Rails 中批量导入 CSV?

ruby-on-rails - 嵌套资源的参数名称是什么

ruby - 在 ruby​​-smpp 中使用 Eventmachine 和 EM-Redis 发送消息

ruby - Ruby 中的隐式返回值