Ruby attr_accessor: имя в: имя [] массив - PullRequest
0 голосов
/ 02 января 2011

Как бы я создал attr_accessor для массива?

например

class MyClass

  attr_accessor :my_attr_accessor

  def initialize()
  end

  def add_new_value(new_array)
    @my_attr_accessor += new_array
    return @my_attr_accessor
  end

end

my_class = MyClass.new
my_class.my_attr_accessor = 1
my_class.my_attr_accessor[1] = 2
my_class.my_attr_accessor.push = 3
my_class.add_new_value(5)

my_class.my_attr_accessor
=> [1, 2, 3, 5]

Ответы [ 2 ]

3 голосов
/ 02 января 2011

Просто используйте переменную экземпляра, которая указывает на массив, и создайте метод доступа из этой переменной экземпляра.

Внутри вашего класса есть что-то вроде этого:

attr_accessor :my_attr_accessor
def initialize
    @my_attr_accessor = []
end

Обратите внимание, что использование attr_accessor позволит вам изменить значение переменной. Если вы хотите убедиться, что массив остается, используйте attr_reader вместо attr_accessor. Вы по-прежнему сможете обращаться к элементам массива и устанавливать их, а также выполнять операции с массивом, но вы не сможете заменить его новым значением, и использование += для объединения не будет работать.

1 голос
/ 02 января 2011

Если вы в порядке с массивом, который всегда существует, ответ @ david4dev хороший.Если вы хотите, чтобы массив появлялся только при первом использовании, и никогда не хотите, чтобы пользователь мог заменить его новым массивом (посредством назначения):

class MyClass
  def my_attr_accessor
    @my_attr_accessor ||= []
  end
  def add_new_value( value )
    my_attr_accessor << value
  end
  def add_new_values( values_array )
    my_attr_accessor.concat values_array
  end
end

Пользователь можетвсе еще звоните my_class.my_attr_accessor.replace( [] ), чтобы стереть это.

...