gpt4 book ai didi

ruby - 用历史初始化类似 `attr_accessor` 的方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:17:39 24 4
gpt4 key购买 nike

class Class
def attr_accessor_with_history(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name
attr_reader attr_name + "_history"
class_eval %Q{
def #{attr_name}=(new_value)
@#{attr_name}_history = [nil] if @#{attr_name}_history.nil?
@#{attr_name}_history << @#{attr_name} = new_value
end
}
end
end

class Example
attr_accessor_with_history :foo
attr_accessor_with_history :bar
end

Class.attr_accessor_with_history 方法提供相同的作为 attr_accessor 的功能,但也跟踪属性具有的每个值曾经有过。

> a = Example.new; a.foo = 2; a.foo = "test"; a.foo_history
=> [nil, 2, "test"]

但是,

> a = Example.new; a.foo_history
=> nil

它应该是[nil

如何为 Example 类定义单个 initialize 方法,其中每个…_history 值将被初始化为[nil]?

最佳答案

我认为,您最好的选择是为历史定义一个自定义阅读器(以及您的自定义编写器)。

class Class
def attr_accessor_with_history(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name
class_eval %Q{
def #{attr_name}_history
@#{attr_name}_history || [nil] # give default value if not assigned
end

def #{attr_name}=(new_value)
@#{attr_name}_history ||= [nil] # shortcut, compare to your line
@#{attr_name}_history << @#{attr_name} = new_value
end
}
end
end

class Example
attr_accessor_with_history :foo
attr_accessor_with_history :bar
end

a = Example.new; a.foo = 2; a.foo = "test";
a.foo_history # => [nil, 2, "test"]

a = Example.new
a.foo_history # => [nil]

编辑:

这里有一个稍微冗长的代码片段,但它没有使用 class_eval(在没有必要的情况下使用时不受欢迎)。

class Class
def attr_accessor_with_history(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name

define_method "#{attr_name}_history" do
instance_variable_get("@#{attr_name}_history") || [nil]
end

define_method "#{attr_name}=" do |new_value|
v = instance_variable_get("@#{attr_name}_history")
v ||= [nil]
v << new_value

instance_variable_set("@#{attr_name}_history", v)
instance_variable_set("@#{attr_name}", new_value)
end
end
end

关于ruby - 用历史初始化类似 `attr_accessor` 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604149/

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