Введите значения приведения во время attr_accessor - PullRequest
1 голос
/ 20 января 2012

Я новичок в Ruby и изучаю его, используя "Программирование на Ruby 1.9" (PickAxe). В книге я вижу программу, которую я изменил так:

 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_accessor для этого? Или я слишком многого прошу: D

Я не смог найти таких ссылок в Интернете.

Ответы [ 3 ]

2 голосов
/ 20 января 2012

attr_accessor :sym - это метод класса, который определяет простые методы получения и установки.

Вы можете определить свой собственный casting_attr_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
1 голос
/ 20 января 2012

Да, вы просите слишком много.Вам нужно определить price= точно так же, как в закомментированном коде.

attr_accessor - это просто упрощенный способ определения

def price=(val)
  @price = val
end

(без указания типапреобразование) плюс метод получения.

Очевидно, что когда вы определяете price=, attr_accessor :price больше не нужен (только attr_reader).

Наконец, я бы лучше написал val.to_f вместо Float(val).

1 голос
/ 20 января 2012

Вы не можете сделать это без написания собственного метода установки. То, что attr_accessor :method делает внутри, это просто генерирует вам самый простой из возможных методов установки:

def method=(val)
    @method = val
end

Вам нужно написать более продвинутый метод установки (в вашем случае программа установки будет содержать преобразование строки в плавающее) вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...