Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call a method in a class in another class in Ruby

I was wondering how I could call a method in an instance of a class in another class.

This is what I came up with

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

But I get this error:

Testing.rb:9:in initialize': undefined local variable or method instance' for # (NameError) from Testing.rb:19:in new' from Testing.rb:19:in'

How could I fix it?

Thank you for your response.

like image 346
Pabi Avatar asked Jul 11 '15 19:07

Pabi


2 Answers

From your description this seems to be what you're going for:

class ClassB
  def initialize
    @instance_of_class_a = ClassA.new
  end

  def method_calls_method
    @instance_of_class_a.method
  end
end

Or to pass in the ClassA instance (this is called dependency injection):

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
like image 117
Mori Avatar answered Nov 11 '22 11:11

Mori


Another Option would be to take a look at class methods: https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/113-class-variables

So in your code it would look similar to this:

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

*Notice the self. in ClassA to signify a class method. This is similar to a static method in other languages.

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

Class(static) methods are meant to be relevant to all the instances of a class rather than to any specific instance.

You see class methods used a lot in the ruby Math class: http://ruby-doc.org/core-2.2.2/Math.html

For example taking a square root of a number in is done by using the class method Math.sqrt. This is different from an instance method which would look like object.method instead Class.method. There are a lot of resources and tutorials out that explains this concept in more detail and probably clearer.

like image 4
timthez Avatar answered Nov 11 '22 12:11

timthez