Допустим, у меня есть класс счетчика в рубин, определяемый какЗаполнение массива рубиновый с объекта по умолчанию
class Counter
attr_accessor :starting_value
def initialize(starting_value)
@starting_value = starting_value
end
def tick
@starting_value = @starting_value + 1
end
end
, и я хочу, чтобы заполнить массив с этим объектом, используя параметр по умолчанию, например: counter_arr = Array.new(5, Counter.new(0))
Это почти то, что я хочу, за исключением того, что у меня теперь есть массив, содержащий тот же экземпляр счетчика 5 раз, вместо массива из 5 новых счетчиков. IE, когда я запускаю код
counter_arr = Array.new(5, Counter.new(0))
counter_arr[0].tick
counter_arr.each do |c|
puts(c.starting_value)
end
выход I
1
1
1
1
1
вместо
1
0
0
0
0
Мне было интересно, что такое "рубин-эск" способ инициализировать массив с кратному новые экземпляры объекта?
Не забывайте синтаксические функции, такие как '@starting_value + = 1'. Это обычно меньше подробностей и позволяет избежать опечаток. – tadman
Этот код в значительной степени соответствует линии, аналогичной примеру в разделе «Common gotchas» документов для «Array :: new» (http://ruby-doc.org/core/Array.html # method-c-new-label-Common + gotchas), которые отвечают на этот вопрос. –