Вызов метода в классе в другом классе в Ruby
мне было интересно, как я могу вызвать метод экземпляра класса в другом классе.
вот что я придумал
class ClassA
def method
return "This is a method_from_class_A"
end
end
class ClassB
def initialize
@method_from_class_A=instance.method
end
def method_calls_method
@method_from_class_A
end
end
instance=ClassA.new
instance2=ClassB.new
puts instance2.method_calls_method
но я получаю эту ошибку:
тестирование.rb: 9: in
initialize': undefined local variable or method
экземпляр' для # (NameError) от Тестирование.rb: 19: innew' from Testing.rb:19:in
'
как я мог это исправить?
Спасибо за ваш ответ.
2 ответов
из вашего описания это, кажется, то, что вы собираетесь:
class ClassB
def initialize
@instance_of_class_a = ClassA.new
end
def method_calls_method
@instance_of_class_a.method
end
end
или в ClassA
экземпляр (это называется внедрение зависимостей):
class ClassB
def initialize(class_a_instance)
@instance_of_class_a = class_a_instance
end
def method_calls_method
@instance_of_class_a.method
end
end
instance_a = ClassA.new
instance_b = ClassB.new(instance_a)
puts instance_b.method_calls_method
другим вариантом было бы взглянуть на методы класса: https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/113-class-variables
так, в коде это будет выглядеть примерно так:
class ClassA
def self.method
return "This is a method_from_class_A"
end
end
class ClassB
def method_calls_method
ClassA.method
end
end
instance=ClassB.new
puts instance.method_calls_method
*обратите внимание на self.
в ClassA для обозначения метода класса. Это похоже на статический метод в других языках.
по данным Википедии: https://en.wikipedia.org/wiki/Method_ (computer_programming)#Static_methods
методы класса(статические) предназначены для всех экземпляров класса, а не для любого конкретного экземпляра.
вы видите методы класса, используемые в классе ruby Math: http://ruby-doc.org/core-2.2.2/Math.html
например, принимая квадратный корень из числа в делается с помощью метода класса Math.sqrt
. Это отличается от метод экземпляра, который будет выглядеть как object.method
вместо Class.method
. Есть много ресурсов и учебников, которые объясняют эту концепцию более подробно и, вероятно, яснее.