gpt4 book ai didi

ruby - 为所有实例变量声明 `attr_reader` 而不列出它们

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:27 26 4
gpt4 key购买 nike

在 Ruby 中,您可以通过将以下内容添加到类定义中来创建 getter/setter 方法。

attr_reader :key1, :key2, :key4
attr_writer :key1, :key2, :key3

或等效

attr_accessor :key1, :key2, :key3

例如

class Foo
attr_reader :blah, :bar, :foo, :rah, :jar

def initialize a, b, c
@blah = calculate_blah(a,b)
@bar = calculate_bar(a)
@foo = calculate_foo(b,c)
@rah = calculate_rah(a,b,c)
@jar = calculate_jar(a,c)
end
# etc etc
end

假设有很多实例变量,我想要 getter 方法在所有这些上。

是否可以在所有实例变量上声明 attr_reader 而无需将它们全部列出?

这样做的好处是您不必维护两个变量列表(它们是相同的),一个在 initialize 方法中,另一个在 attr_reader 中。所以以后如果你想添加另一个实例变量,你只需要在initialize方法中设置它,而不需要将它也添加到attr_reader列表中。

如果这在 attr_reader 中不可用,也许可以调用一些元编程来提供帮助?

此处的主要目标是了解这在 Ruby 中是否可行。使用元编程通常会导致性能成本和模糊性。但这超出了这个问题的范围。

我更想知道是否有可能做某事,而不是那是否是正确的做法。

最佳答案

假设

class A
def initialize
@b=0
@c=1
end
end

然后

a = A.new

a.instance_variables.each { |iv| self.class.send(:attr_reader, iv.to_s[1..-1].to_sym) }

a.b #=> 0
a.c #=> 1

如果所有实例变量都在initialize中定义,你可以这样写

class A
def initialize
@b=0
@c=1
instance_variables.each do |iv|
self.class.send(:attr_reader, iv.to_s[1..-1].to_sym)
end
end
end

a = A.new
a.b #=> 0
a.c #=> 1

关于ruby - 为所有实例变量声明 `attr_reader` 而不列出它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36719534/

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