Вызов метода в классе в другом классе в 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: in new' 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. Есть много ресурсов и учебников, которые объясняют эту концепцию более подробно и, вероятно, яснее.