web-dev-qa-db-fra.com

Appeler une méthode dans une classe d'une autre classe en Ruby

Je me demandais comment appeler une méthode dans une instance d'une classe d'une autre classe.

C'est ce que je suis venu avec

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

Mais je reçois cette erreur:

Testing.rb: 9: dans l'instance initialize': undefined local variable or method 'pour # (NameError) à partir de Testing.rb: 19: dans new' from Testing.rb:19:in'

Comment pourrais-je le réparer?

Merci pour votre réponse.

6
Pabi

D'après votre description, cela semble être ce que vous recherchez:

class ClassB
  def initialize
    @instance_of_class_a = ClassA.new
  end

  def method_calls_method
    @instance_of_class_a.method
  end
end

Ou pour passer dans l'instance ClassA (on parle d'injection de dépendance):

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
7
Mori

Une autre option serait d’examiner les méthodes de classe: https://rubymonk.com/learning/books/4-Ruby-primer-ascent/chapters/45-more-classes/lessons/113-class-variables

Donc, dans votre code, cela ressemblerait à ceci:

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

* Notez que self. dans ClassA indique une méthode de classe. Ceci est similaire à une méthode statique dans d'autres langues.

Selon wikipedia: https://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods

Les méthodes de classe (statiques) sont censées être pertinentes pour toutes les instances d'une classe plutôt que pour une instance spécifique.

Vous voyez beaucoup de méthodes de classe utilisées dans la classe Ruby Math: http://Ruby-doc.org/core-2.2.2/Math.html

Par exemple, la racine carrée d’un nombre est obtenue à l’aide de la méthode de classe Math.sqrt. C'est différent d'une méthode d'instance qui ressemblerait à object.method à la place de Class.method. Il existe de nombreuses ressources et didacticiels qui expliquent ce concept de manière plus détaillée et probablement plus claire.

2
timthez