gpt4 book ai didi

ruby - attr_accessor 在写入时将 nil 转换为字符串

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

我有一个数据对象,其中包含许多用于各种输入的 attr_accessor 字段。我可以以某种方式定义类,以便所有字段的所有 setter 都将例如将值设置为空字符串而不是尝试的 nil?

最佳答案

这里有一个小模块可以做到这一点:

module NilToBlankAttrAccessor

def nil_to_blank_attr_accessor(attr)
attr_reader attr
define_method "#{attr}=" do |value|
value = '' if value.nil?
instance_variable_set "@#{attr}", value
end
end

end

只需将其混合:

class Foo
extend NilToBlankAttrAccessor
nil_to_blank_attr_accessor :bar
end

并使用它:

foo = Foo.new
foo.bar = nil
p foo.bar # => ""
foo.bar = 'abc'
p foo.bar # => "abc"

工作原理

NilToBlankAttrAccessor#nil_to_blank_attr_accessor 首先正常定义 attr_reader:

    attr_reader attr

然后它通过定义一个与访问器同名的方法来定义编写器,只是在末尾加上一个“=”。因此,对于属性 :bar,该方法被命名为 bar=

    define_method "#{attr}=" do |value|
...
end

现在需要设置变量。首先它把 nil 变成一个空字符串:

      value = '' if value.nil?

然后使用 instance_variable_set,它执行实例变量赋值,其中实例变量直到运行时才知道。

      instance_variable_set "@#{attr}", value

Foo 类需要 nil_to_blank_attr_accessor 成为类方法,而不是实例方法,所以它使用 extend 而不是 include:

class Foo
extend NilToBlankAttrAccessor
...
end

关于ruby - attr_accessor 在写入时将 nil 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451449/

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