gpt4 book ai didi

ruby - 自定义 attr_reader 以进行属性的惰性实例化

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

(大编辑,我在那里的一部分......)我一直在努力,我想出了这种方法来指定在读取属性之前需要完成的事情:

class Class
def attr_reader(*params)
if block_given?
params.each do |sym|
define_method(sym) do
yield
self.instance_variable_get("@#{sym}")
end
end
else
params.each do |sym|
attr sym
end
end
end
end

class Test
attr_reader :normal
attr_reader(:jp,:nope) { changethings if @nope.nil? }

def initialize
@normal = "Normal"
@jp = "JP"
@done = false
end

def changethings
p "doing"
@jp = "Haha!"
@nope = "poop"
end

end

j = Test.new

p j.normal
p j.jp

但是 changethings 并没有被认为是一种方法——有人有什么想法吗?

最佳答案

您需要在实例的上下文中评估 block 。 yield 默认情况下将在其 native 上下文中对其进行评估。

class Class
def attr_reader(*params, &blk)
if block_given?
params.each do |sym|
define_method(sym) do
self.instance_eval(&blk)
self.instance_variable_get("@#{sym}")
end
end
else
params.each do |sym|
attr sym
end
end
end
end

关于ruby - 自定义 attr_reader 以进行属性的惰性实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247962/

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