Another Ruby language question


#1

Following from yesterday I have a few more Ruby questions.

Can someone please explain what ‘self’ does in the following:

module Mod1
def self.a_method
puts ‘a’
end

def b_method
puts ‘b’
end
end

If self isn’t specificed I’m unable to call the method. ex.
Mod1::b_method fails.

I’ve scoured on-line docs about module and come up empty.

Next. What does ‘/upload’ mean in:
class Upload < R ‘/upload’
This is from:

Thanks.


Neville F., http://www.getsoft.com http://www.surfulater.com


#2

On 1/27/07, Neville F. removed_email_address@domain.invalid wrote:

 puts 'b'

end
end

If self isn’t specificed I’m unable to call the method. ex.
Mod1::b_method fails.

So in this particular case, ‘self’ here refers to the Module called
Mod1. Your code defines a method (a_method) on the module itself which
allows you to call it with the :: syntax.

The other method (b_method) is merely a method defined inside the
module. In this case the module is acting as a namespace. If you
‘include’ this module somewhere in your code you’ll be adding the
b_method to that place (scope?)

(disclaimer: I’m still learning ruby myself, so that may not be the
best answer ever, but it is how I understand it… And knowing these
guys these days I’ll be corrected if I’m wrong, mere moments from
now.)

Next. What does ‘/upload’ mean in:
class Upload < R ‘/upload’
This is from:
http://www.oreillynet.com/ruby/blog/2007/01/the_joy_of_rolling_your_own_wi.html

Right here you’re fishing in _why territory (specifically the camping
framework) where things are way over my head, someone else will have
to help you there.

hth,
-Harold


#3

Harold H. wrote:

On 1/27/07, Neville F. removed_email_address@domain.invalid wrote:

 puts 'b'

end
end

If self isn’t specificed I’m unable to call the method. ex.
Mod1::b_method fails.

So in this particular case, ‘self’ here refers to the Module called
Mod1. Your code defines a method (a_method) on the module itself which
allows you to call it with the :: syntax.

The other method (b_method) is merely a method defined inside the
module. In this case the module is acting as a namespace. If you
‘include’ this module somewhere in your code you’ll be adding the
b_method to that place (scope?)

(disclaimer: I’m still learning ruby myself, so that may not be the
best answer ever, but it is how I understand it… And knowing these
guys these days I’ll be corrected if I’m wrong, mere moments from
now.)

Harold,
Thanks for that. I figured I understood the use of self, but assumed it
was redundant and therefore I couldn’t see the difference between
a_method and b_method. Now I get it. In my C++ world we don’t qualify
methods like this.


Neville F., http://www.getsoft.com http://www.surfulater.com


#4

On 1/27/07, Neville F. removed_email_address@domain.invalid wrote:

was redundant and therefore I couldn’t see the difference between
a_method and b_method. Now I get it. In my C++ world we don’t qualify
methods like this.

No problemo.

In comparison to C++, your a_method is (kinda sorta) like a static
method, but not really, but kindof because you can use the :: syntax
to call it.

b_method is more like a method belonging to a class which you’re
inheriting. The instances of your new class can call b_method
(assuming you’ve included Mod1) …

Ruby only supports single inheritance directly, but you can emulate
multiple inheritance like this by just including multiple modules into
your class… I believe the rubyists like to call this mixing-in…

hth,
-Harold


#5

So I assume that:

module Mod1
def self.a_method
puts ‘a’
end
end

is identical to:

module Mod1
def Mod1.a_method
puts ‘a’
end
end


Neville F., http://www.getsoft.com http://www.surfulater.com


#6

On 1/27/07, Neville F. removed_email_address@domain.invalid wrote:

module Mod1
def Mod1.a_method
puts ‘a’
end
end

indeed.

(apologies to anyone not reading this in a threaded fashion for the
extremely short reply.)

-Harold


#7

On 1/26/07, Neville F. removed_email_address@domain.invalid wrote:

 puts 'b'

end
end

If self isn’t specificed I’m unable to call the method. ex.
Mod1::b_method fails.

I’ve scoured on-line docs about module and come up empty.

I see people already helped you with this one

Next. What does ‘/upload’ mean in:
class Upload < R ‘/upload’

This is the beginning of a controller definition in the Camping
microframework. The class is “inheriting” from the method R() which
takes a regex argument of the route to bind to. The R() method then
adds some meta-info to the runtime, and returns an anonymous class
that Upload actually inherits from.