Question

I'm working through Zed Shaw's Learn Ruby The Hard Way and I'm having an issue including a module in IRB. In exercise 25, we define a new module Ex25, require it in IRB, and then can use its various methods through the namespace of that module, e.g. Ex25.break_words(sentence). In the Extra Credit, it's stated that typing include Ex25 will basically add the methods from the module into the current "space" (not sure what to call it) and you can then call them without explicitly referring to the module, e.g. break_words(sentence). When I do this, however, I'm getting an "undefined method" error. Any help / explanation would be greatly appreciated, thanks!

Was it helpful?

Solution

That's an error in the book. The methods in Ex25 are class methods. include adds instance methods to the "current space." Remove self from the method definitions and it'll work:

module Ex25
  def break_words(stuff)
    stuff.split(' ')
  end
end

include Ex25
break_words 'hi there'  # => ["hi", "there"]

If you're curious, here's some more detail about what's going on: The place where the methods are included—the "current space"—is the Object class:

Object.included_modules  # => [Ex25, Kernel]

All Object instances gain the included methods ...

Object.new.break_words 'how are you?'  # => ["how", "are", "you?"]

... and the top-level is just an Object instance:

self.class  # => Object

But wait. If the top-level is an Object instance, why does it respond to include? Isn't include an instance method of Module (and its subclass, Class)? The answer is that the top-level has a singleton method ...

singleton_methods.include? "include"  # => true

... which we can assume forwards to the Object class.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top