Jest jeden problem z tymi dwoma metodami tutaj ... jeśli zmienna instancji jest ustawiona w jednej instancji, jego akcesor będzie dostępny dla wszystkich instancji, ponieważ definiujesz metody na self.class
zamiast na sobie.
dude = Mine.new
dude.my_number 1
puts dude.my_1
dudette = Mine.new
dudette.my_1 = 2 # works, but probably shouldn't
dudette.my_number 2
dude.my_2 = 3 # works, but probably shouldn't
Co prawdopodobnie chcesz zrobić, to zmodyfikować tylko instancję, która ma zmienną instancji:
class Mine
# ...
def my_number num
class << self
attr_accessor "my_#{num}"
end
self.send("my_#{num}=", num)
end
end
ten sposób zmienne instancji dostać tylko akcesorów na obiektach, które zostały utworzone za. Również nie zawracałem sobie głowy parametrem instance_variable_set, ponieważ jeśli ustawiasz accessor, myślę, że lepiej będzie go ponownie użyć. Ale to połączenie stylu. Wielką zaletą jest tutaj wywołanie class << self
zamiast self.class
.
Czy jest jakiś powód używania 'singleton_class'? Również bycie jednym linkiem, 'class_eval {attr_accessor:" moja _ # {num} "}' składnia byłaby czystsza :) –
@ HalilÖzgür chcesz zdefiniować tę metodę tylko dla tej instancji, dlatego właśnie używasz 'singleton_class', jeśli użyjesz 'self.class', wtedy wszystkie instancje uzyskają tę metodę, a ty tego nie chcesz. masz rację ze składnią, zrobię zmianę – Orlando
btw singleton_class jest tym samym, co robienie 'class << self' – Orlando