Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在attr_访问器期间键入强制转换值_Ruby - Fatal编程技术网

Ruby 在attr_访问器期间键入强制转换值

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

我是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                 @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访问者
不是语法糖,它只是一个无聊的常规旧邮件发送。