Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
comp.lang.ruby
Modules
Oliver Saunders
7/12/2008 5:06:00 AM
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-...
.
2 Answers
matt
7/13/2008 12:44:00 AM
0
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.
I'd say you're not confused at all. You've described perfectly how the
language behaves.
m.
--
matt neuburg, phd = matt@tidbits.com,
http://www.tidbits...
Leopard -
http://www.takecontrolbooks.com/leopard-custom...
AppleScript -
http://www.amazon.com/gp/product/...
Read TidBITS! It's free and smart.
http://www.t...
Rimantas Liubertas
7/13/2008 1:43:00 AM
0
>> >> 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
from :0
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
--
http://rim...
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
Modules
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password