class Class
def casting_attr_accessor(accessor, type)
define_method(accessor) do
instance_variable_get("@#{accessor}")
end
define_method("#{accessor}=") do |val|
instance_variable_set("@#{accessor}", Kernel.send(type.to_s, val))
end
end
end
# config/initializers/casting_attr_accessor.rb
# https://stackoverflow.com/a/8940255/287166
class Class
def casting_attr_accessor(*accessors, type)
Array(accessors).each do |accessor|
define_method(accessor) do
instance_variable_get("@#{accessor}")
end
define_method("#{accessor}=") do |val|
instance_variable_set("@#{accessor}", Kernel.send(type.to_s, val)) unless val.nil?
end
end
end
end
4条答案
按热度按时间s4chpxco1#
attr_accessor :sym
是定义简单的getter和setter方法的类的方法。您可以定义自己的
casting_attr_accessor
:然后在你的班上使用它,就像
1aaf6o9v2#
如果不编写自己的setter方法,就无法做到这一点。
attr_accessor :method
在内部所做的只是生成可能最简单的setter方法:您需要手动编写更高级的setter方法(在本例中,setter将包含字符串到浮点数的转换)。
cu6pst1q3#
是的,你的要求太高了。您必须完全按照注解代码中的定义来定义
price=
。attr_accessor
只是定义(没有类型转换)加上getter方法。
显然,当您定义
price=
时,不再需要attr_accessor :price
(只需要attr_reader
)。最后,我宁愿写
val.to_f
,而不是Float(val)
。5vf7fwbs4#
基于Tomgi Answer,这是一个支持多个属性的版本,因此您可以使用
放在加载路径中的某个位置,在Rails中我使用初始值设定项