Я хочу иметь массив как переменную экземпляра, используя attr_accessor
.
Но не attr_accessor
только для строк?
Как использовать его в массиве?
UPDATE:
Eg. Если вы хотите:
object.array = "cat"
object.array = "dog"
pp object.array
=> ["cat", "dog"]
Затем вы должны сами создать эти методы?
Ответ 1
Повторите свое обновление:
Хотя вы можете реализовать класс, который действует, как вы описываете, он довольно необычен и, вероятно, смутит любого, кто использует класс.
Обычно у аксессуаров есть сеттеры и геттеры. Когда вы устанавливаете что-то с помощью сеттера, вы получаете то же самое от получателя. В приведенном ниже примере вы получаете что-то совершенно другое от геттера. Вместо использования сеттера вы, вероятно, должны использовать метод add
.
class StrangePropertyAccessorClass
def initialize
@data = []
end
def array=(value) # this is bad, use the add method below instead
@data.push(value)
end
def array
@data
end
end
object = StrangePropertyAccessorClass.new
object.array = "cat"
object.array = "dog"
pp object.array
Метод добавления будет выглядеть так:
def add(value)
@data.push(value)
end
...
object.add "cat"
object.add "dog"
pp object.array
Ответ 2
class SomeObject
attr_accessor :array
def initialize
self.array = []
end
end
o = SomeObject.new
o.array.push :a
o.array.push :b
o.array << :c
o.array.inspect #=> [:a, :b, :c]
Ответ 3
Это работает для меня:
class Foo
attr_accessor :arr
def initialize()
@arr = [1,2,3]
end
end
f = Foo.new
p f.arr
Возвращает следующие
$ ruby /tmp/t.rb
[1, 2, 3]
$
Ответ 4
Я думаю, что есть случай для этого использования. Рассмотрим
begin
result = do_something(obj)
# I can't handle the thought of failure, only one result matters!
obj.result = result
rescue
result = try_something_else(obj)
# okay so only this result matters!
obj.result = result
end
И затем позже
# We don't really care how many times we tried only the last result matters
obj.result
И тогда для pro мы имеем
# How many times did we have to try?
obj.results.count
Итак, я бы:
attr_accessor :results
def initialize
@results = []
end
def result=(x)
@results << x
end
def result
@results.last
end
Таким образом, result
ведет себя так, как вы ожидали, но вы также получаете доступ к прошлым значениям.