在运行时向 Ruby 类添加类实例变量和 attr_reader ?

发布于 2024-10-08 21:43:43 字数 383 浏览 8 评论 0原文

如何在运行时添加类实例变量、其数据和 attr_reader?

class Module
  def additional_data member, data
    self.class.send(:define_method, member)  {
      p "Added method #{member} to #{name}"
    }
  end
end

例如,给定这个类

class Test
  additional_data :status, 55
end

,现在我可以调用:

p Test.status # => prints 55

How do I add a class instance variable, the data for it and a attr_reader at runtime?

class Module
  def additional_data member, data
    self.class.send(:define_method, member)  {
      p "Added method #{member} to #{name}"
    }
  end
end

For example, given this class

class Test
  additional_data :status, 55
end

So that now I can call:

p Test.status # => prints 55

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

看透却不说透 2024-10-15 21:43:43

这个怎么样?

class Object
  def self.additional_data(name, value)
    ivar_name = "@#{name}"

    instance_variable_set(ivar_name, value)

    self.class.send(:define_method, name) do
      instance_variable_get(ivar_name)
    end

    self.class.send(:define_method, "#{name}=") do |new_value|
      instance_variable_set(ivar_name, new_value)
    end
  end
end

class Foo
  additional_data :bar, 'baz'
end

puts Foo.bar # => 'baz'
Foo.bar = 'quux'
puts Foo.bar # => 'quux'

这是非常不言自明的,但如果您有任何疑问,请告诉我。

How about this?

class Object
  def self.additional_data(name, value)
    ivar_name = "@#{name}"

    instance_variable_set(ivar_name, value)

    self.class.send(:define_method, name) do
      instance_variable_get(ivar_name)
    end

    self.class.send(:define_method, "#{name}=") do |new_value|
      instance_variable_set(ivar_name, new_value)
    end
  end
end

class Foo
  additional_data :bar, 'baz'
end

puts Foo.bar # => 'baz'
Foo.bar = 'quux'
puts Foo.bar # => 'quux'

It's pretty self-explanatory, but let me know if you have any questions.

素衣风尘叹 2024-10-15 21:43:43

Module#class_eval 就是您想要的:

def add_status(cls)
  cls.class_eval do
    attr_reader :status
  end
end

add_status(Test)

Module#class_eval is what you want:

def add_status(cls)
  cls.class_eval do
    attr_reader :status
  end
end

add_status(Test)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文