attr_accessor для массива? - PullRequest
       2

attr_accessor для массива?

11 голосов
/ 12 сентября 2010

Я хочу иметь массив в качестве переменной экземпляра, используя attr_accessor.

Но не attr_accessor только для строк?

Как мне использовать его в массиве?

UPDATE:

Например. Если вы хотите:

object.array = "cat"
object.array = "dog"
pp object.array
=> ["cat", "dog"]

Тогда вы должны сами создать эти методы?

Ответы [ 4 ]

19 голосов
/ 12 сентября 2010
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]
14 голосов
/ 12 сентября 2010

Re ваше обновление:

Хотя вы можете реализовать класс, который действует так, как вы его описали, он довольно необычен и, вероятно, запутает любого, кто использует класс.

Обычно методы доступа имеют сеттеры и геттеры. Когда вы устанавливаете что-то с помощью установщика, вы получаете то же самое обратно от получателя. В приведенном ниже примере вы получаете что-то совершенно другое от получателя. Вместо того, чтобы использовать сеттер, вы, вероятно, должны использовать метод 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 голосов
/ 12 сентября 2010

у меня работает:

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]
$
1 голос
/ 15 апреля 2011

Я думаю, что есть причина для этого использования. Рассмотрим

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

А потом для профессионалов у нас есть

# 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 ведет себя так, как вы ожидаете, но вы также получаете преимущество доступа к прошлым значениям.

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