ruby / возможность делить одну переменную между несколькими классами - PullRequest
0 голосов
/ 29 сентября 2018

Для понимания общих классов манипуляции;учитывая следующий вариант использования:

class Child1
  def process var
    'child1' + var
  end
end

class Child2
  def process var
    'child1' + var
  end
end

class Child3
  def process var
    'child3' + var
  end
end

...

class Master
  attr_reader :var
  def initialize(var)
    @var = var
  end

  def process
    [
      Child1.new.process(var),
      Child2.new.process(var),
      Child3.new.process(var)
    ]
  end
end

по какому-либо типу наследования или структуры, будет ли способ сделать var доступным для всех детей?

Значение:

class Child1 < Inherited
  def process
    'child1' + var
  end
end

...

class Master
  ...
  def process
    [
      Child1.new.process,
      ...
    ]
  end
end

Я недостаточно знаю свою вещь, чтобы найти предпочтительный подход (хотя первый пример, приведенный выше, работает нормально, хотя, возможно, не самый элегантный);спасибо за любое руководство

1 Ответ

0 голосов
/ 29 сентября 2018

Я думаю, вы ищете переменные класса.

Переменные класса

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

Переменная класса должна начинаться с @@ (два знака «at»).Остальная часть имени следует тем же правилам, что и переменные экземпляра.

Вот пример:

class A
  @@class_variable = 0

  def value
    @@class_variable
  end

  def update
    @@class_variable = @@class_variable + 1
  end
end

class B < A
  def update
    @@class_variable = @@class_variable + 2
  end
end

a = A.new
b = B.new

puts "A value: #{a.value}"
puts "B value: #{b.value}"

Это печатает:

A value: 0
B value: 0

Продолжение с тем же примероммы можем обновлять, используя объекты из любого класса, и значение является общим:

puts "update A"
a.update

puts "A value: #{a.value}"
puts "B value: #{b.value}"

puts "update B"
b.update

puts "A value: #{a.value}"
puts "B value: #{b.value}"

puts "update A"
a.update

puts "A value: #{a.value}"
puts "B value: #{b.value}"

Это печатает:

update A
A value: 1
B value: 1
update B
A value: 3
B value: 3
update A
A value: 4
B value: 4

Доступ к неинициализированной переменной класса вызовет NameError исключение.

Обратите внимание, что у классов есть переменные экземпляра, поскольку классы являются объектами, поэтому старайтесь не путать переменные класса и экземпляра.

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