Ruby:如何即时创建 attr_accessor

标签 ruby attributes attr-accessor

我想知道如何即时创建 attr_accessor。是否可以做类似的事情:

attr_accessor "@#{key}" 

在初始化方法中?

module Mymodule
  def initialize(parameters = {})
    parameters.each do |key, value|
      instance_variable_set("@#{key}", value) unless value.nil?
    end
  end
end

class Myclass
  include Mymodule
end

clazz = Myclass.new attr1: "Arg1", attr2: "Arg2", attr3: "Arg3"
  # => #<Myclass:0x43f6050 @attr1="Arg1", @attr2="Arg2", @attr3="Arg3">

clazz.attr1
  # !> NoMethodError: undefined method `attr1' for #<Myclass:0x43f6050 @attr1="Arg1", @attr2="Arg2", @attr3="Arg3">

clazz.attr1="ATTR1"
  # !> NoMethodError: undefined method `attr1=' for #<Myclass:0x43f6050 @attr1="Arg1", @attr2="Arg2", @attr3="Arg3">

最佳答案

您可以通过在该实例的单例类上调用 attr_accessor 来定义每个实例的访问器。

class Structy
  def initialize(parameters = {})
    parameters.each do |key, value|
      singleton_class.send :attr_accessor, key
      instance_variable_set "@#{key}", value
    end
  end
end

关于Ruby:如何即时创建 attr_accessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45796806/

相关文章:

Ruby:是否有带有 attr_initialize 方法的 gem?

ruby - 如何在 Sinatra 中使用 Pry?

ruby-on-rails - Ruby:如何将数组写入 postgresql?

ruby-on-rails - 为什么 '/' 可以正确匹配我的 Rails 3 应用程序中的 Rack 应用程序,但没有其他路由可以正确匹配?

c# - 如何将管道代码注入(inject)/生成用属性装饰的方法?

asp.net-mvc-3 - 如何让 MVC3 DisplayFor 显示枚举的 Display-Attribute 的值?

java - 这是什么服务器端编程语言?

c# - 获取 DisplayName 属性的值

ruby - 如何删除 ruby​​ 中的 attr_accessor

ruby-on-rails - Rails 模型 attr_accessor 属性没有保存?