Modules

I understand the way these things are working but I don't really
understand what's going on and why.

module Foo
  def bar
    1
  end
  def Foo.zim
    2
  end
end

Foo.zim # works, OK, fair enough

2

Foo::zim # works, but why have two syntaxes that do the same?

2

Foo.bar # NoMethodError. Shouldn't this work though? What if I had a procedural API that I wanted to namespace: -

module SomeNamespace
  require 'procedural_api'
end

SomeNamespace.function_from_procedural_api # this ain't gonna work!
SomeNamespace::function_from_procedural_api # nor is this

class SomeClass
  include Foo
end

SomeClass.new.bar # OK, it's been mixed in

1

SomeClass.zim # NoMethodError, huh? Why doesn't this work?
SomeClass.new.zim # NoMethodError. So where has the zim definition actually gone? Doesn't it get included at all?

I'm very confused by all this. Please help unravel the mess in my brain.

···

--
Posted via http://www.ruby-forum.com/\.

I'd say you're not confused at all. You've described perfectly how the
language behaves.

m.

···

Oliver Saunders <oliver.saunders@gmail.com> wrote:

I understand the way these things are working but I don't really
understand what's going on and why.

module Foo
  def bar
    1
  end
  def Foo.zim
    2
  end
end

>> Foo.zim # works, OK, fair enough
2
>> Foo::zim # works, but why have two syntaxes that do the same?
2
>> Foo.bar # NoMethodError.

class SomeClass
  include Foo
end

>> SomeClass.new.bar # OK, it's been mixed in
1
>> SomeClass.zim # NoMethodError, huh? Why doesn't this work?
>> SomeClass.new.zim # NoMethodError.

I'm very confused by all this. Please help unravel the mess in my brain.

--
matt neuburg, phd = matt@tidbits.com, Matt Neuburg’s Home Page
Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com

>> Foo.zim # works, OK, fair enough
2
>> Foo::zim # works, but why have two syntaxes that do the same?
2

objec.method works for any object. Everything is an object, so Foo is
an object too.
Class::method, Module::method works with class/module methods only.

>> SomeClass.zim # NoMethodError, huh? Why doesn't this work?
>> SomeClass.new.zim # NoMethodError.

Let's take a different angle:

class Baz
def Baz.qux # class method. you can look at it as a singleton method for Baz
3
end
end

=> nil

Baz.qux

=> 3

Baz.new.qux # class method is not available to the instance

NoMethodError: undefined method `qux' for #<Baz:0x35c6f4>
  from (irb):7

Thus zim exists only for the object of the Foo module - not any class
that mixes in Foo, just for THE Foo itself.

Regards,
Rimantas

···

from :0
--
http://rimantas.com/