Ruby 在attr_访问器期间键入强制转换值
我是Ruby的新手,正在使用“编程Ruby1.9”(PickAxe)学习Ruby。在书中,我看到了一个我修改过的程序:Ruby 在attr_访问器期间键入强制转换值,ruby,Ruby,我是Ruby的新手,正在使用“编程Ruby1.9”(PickAxe)学习Ruby。在书中,我看到了一个我修改过的程序: 1 #!/usr/bin/env ruby -w 2 3 class BookInStock 4 attr_reader :isbn 5 attr_accessor :price 6 def initialize(isbn, price) 7 @isbn = isbn 8
1 #!/usr/bin/env ruby -w
2
3 class BookInStock
4 attr_reader :isbn
5 attr_accessor :price
6 def initialize(isbn, price)
7 @isbn = isbn
8 @price = Float(price)
9 end
10 # def price=(price)
11 # @price = Float(price)
12 # end
13 end
14
15 b1 = BookInStock.new("isbn1", 3)
16 p b1
17 b2 = BookInStock.new("isbn2", 3.14)
18 p b2
19 b3 = BookInStock.new("isbn3", "5.67")
20 p b3
21 b3.price = "10.32"
22 p b3
第8行确保将正确的值分配给b3.price
但是我如何处理像第21行这样的情况而不使用像第10-12行那样的方法呢
是否有某种方法可以为此修改attr\u访问器
?还是我的要求太高了
我在网上找不到任何这样的参考资料。如果不编写自己的setter方法,就无法做到这一点。
attr\u accessor:method
在内部所做的只是生成最简单的setter方法:
def method=(val)
@method = val
end
您需要手动编写更高级的setter方法(在您的情况下,setter将包含字符串到浮点的转换)。如果不编写自己的setter方法,则无法执行此操作。
attr\u accessor:method
在内部所做的只是生成最简单的setter方法:
def method=(val)
@method = val
end
您需要手动编写更高级的setter方法(在您的情况下,setter将包含字符串到浮点的转换)。是的,您要求的太多了。您必须严格按照注释掉的代码定义
price=
attr\u accessor
只是一种简单的定义方法
def price=(val)
@price = val
end
(没有类型转换)加上getter方法
显然,当您定义price=
时,不再需要attr\u访问器:price
(仅attr\u阅读器
)
最后,我宁愿写
val.to_f
而不是Float(val)
是的,你要求的太多了。您必须严格按照注释掉的代码定义price=
attr\u accessor
只是一种简单的定义方法
def price=(val)
@price = val
end
(没有类型转换)加上getter方法
显然,当您定义price=
时,不再需要attr\u访问器:price
(仅attr\u阅读器
)
最后,我宁愿编写
val.to_f
而不是Float(val)
attr\u accessor:sym
是定义简单getter和setter方法的类的方法
您可以定义自己的casting\u attr\u accessor
:
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
然后在你的课堂上像这样使用它
casting_attr_accessor :price, Float
attr\u accessor:sym
是定义简单getter和setter方法的类的方法
您可以定义自己的casting\u attr\u accessor
:
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
然后在你的课堂上像这样使用它
casting_attr_accessor :price, Float
您不应将价格存储在
Float
s中0.30+0.30+0.30
产生0.899999999999
。如果您需要进行财务计算,请使用而不是Float
谢谢。请在其他参考资料中阅读。这只是一个简单的例子。再次感谢您的建议。您不应该将价格存储在Float
s中0.30+0.30+0.30
产生0.899999999999
。如果您需要进行财务计算,请使用而不是Float
谢谢。请在其他参考资料中阅读。这只是一个简单的例子。再次感谢您的建议。attr\u访问者
不是语法糖,它只是一个无聊的常规旧邮件发送。attr\u访问者
不是语法糖,它只是一个无聊的常规旧邮件发送。