Ответ на ваш вопрос @Values from class B are not available in class A. Why?
таков: переменная экземпляра, объявленная на уровне класса, недоступна на уровне объекта.
И ответ на ваш вопрос How can i access them?
: Вы можете объявить класспеременная @@values
вместо переменной экземпляра @values
в методе initialize
.
Ваш пример будет изменен на:
class A
@@values = {}
def initialize()
@@values.each{ |_key, _val|
puts("Key: #{_key}, Val: #{_val}")
}
end
end
class B < A
@@values = { "Test1": "1", "Test2": "2"}
end
Now B.new
Будет выводить
Key: Test1, Val: 1
Key: Test2, Val: 2
Другой ответ:
class A
def initialize()
@values ||= {}
@values.each{ |_key, _val|
puts("Key: #{_key}, Val: #{_val}")
}
end
end
class B < A
def initialize()
@values = { "Test1": "1", "Test2": "2"}
super()
end
end
Примечание. Переменные класса являются общими для связанных классов и могут быть перезаписаны из дочернего класса.Это означает, что если вы переопределите переменную класса @@values
в классе B, @@values
в классе A будет перезаписан.
Другое примечание: {} (обычно используется для однострочных блоков) или do ..конец (используется для многострочных блоков).
Например: используйте
def initialize()
@Values.each{ |_key, _val| puts("Key: #{_key}, Val: #{_val}") }
end
Вместо:
def initialize()
@Values.each{ |_key, _val|
puts("Key: #{_key}, Val: #{_val}")
}
end
ИЛИ
Использовать
def initialize()
@Values.each do |_key, _val|
puts("Key: #{_key}, Val: #{_val}")
end
end
Вместо:
def initialize()
@Values.each{ |_key, _val|
puts("Key: #{_key}, Val: #{_val}")
}
end