gpt4 book ai didi

ruby - 在初始化方法中设置相应实例变量的值时创建 attr_reader 方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:07 25 4
gpt4 key购买 nike

我正在寻找方法来创建相应的 attr_reader 方法,同时在初始化方法中为相应的实例变量设置值?例如下面的代码:

class SomeClass
attr_reader :hello
def initialize( arg)
@hello = arg
end
end

我正在寻找如下写法:

class SomeClass
def initialize( arg)
some_method_as_described_in_question( @hello, arg)
end
end

Ruby 内置类和模块中是否存在执行我所描述的方法?

最佳答案

您可以从方法中打开特征类并在那里设置属性:

class SomeClass
def initialize(arg)
(class << self; self; end).send(:attr_reader, :hello)
@hello = arg
end
end

这样每个实例的特征类都将具有该属性读取器。但实际上,如果属性名称是动态的并且可以因实例而异,那么这样做才有意义。如果它始终是 hello,我看不出像原始代码块那样在类中定义它有什么缺点。

例如,如果你动态传入属性名,你可以这样做:

class SomeClass
def initialize(attr, arg)
(class << self; self; end).send(:attr_reader, attr.to_sym)
instance_variable_set("@#{attr}", arg)
end
end

这与 Ruby 1.8 兼容。从@HenrikN 在对你的问题的评论中得到提示,你可以在 Ruby 1.9 中使用 define_singleton_method:

class SomeClass
def initialize(attr, arg)
define_singleton_method(attr) { instance_variable_get("@#{attr}") }
instance_variable_set("@#{attr}", arg)
end
end

关于ruby - 在初始化方法中设置相应实例变量的值时创建 attr_reader 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com