[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Class Module

Wesley Silva

5/31/2008 9:35:00 PM

Hi, I'm still learning ruby and i'm trying, but I just can't understand
this result...

class Module
@@docs = {}
# Invoked during class definitions
def doc(str)
@@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
end
# invoked to get documentation
def Module::doc(aClass)
# If we're passed a class or module, convert to string
# ('<=' for classes checks for same class or subtype)
aClass = aClass.name if aClass.class <= Module
@@docs[aClass] || "No documentation for #{aClass}"
end
end
class Example
doc("This is a sample documentation string")

# .. rest of class
end

puts Module::doc(Example)


Produces:

Example:
This is a sample documentation string


But

class Module
@@docs = {}
# Invoked during class definitions
def doc(str)
@@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
end
# invoked to get documentation
def Module::doc(aClass)
# If we're passed a class or module, convert to string
# ('<=' for classes checks for same class or subtype)
aClass = aClass.name if aClass.class <= Module
@@docs[aClass] || "No documentation for #{aClass}"
end
end
class Example<Module
doc("This is a sample documentation string")

# .. rest of class
end

puts Module::doc(Example)

Produces:

No documentation for Example


Can anybody tell me why?
--
Posted via http://www.ruby-....

5 Answers

David A. Black

5/31/2008 10:00:00 PM

0

Hi --

On Sun, 1 Jun 2008, Wesley Silva wrote:

> Hi, I'm still learning ruby and i'm trying, but I just can't understand
> this result...
>
> class Module
> @@docs = {}
> # Invoked during class definitions
> def doc(str)
> @@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
> end
> # invoked to get documentation
> def Module::doc(aClass)
> # If we're passed a class or module, convert to string
> # ('<=' for classes checks for same class or subtype)
> aClass = aClass.name if aClass.class <= Module
> @@docs[aClass] || "No documentation for #{aClass}"
> end
> end
> class Example
> doc("This is a sample documentation string")
>
> # .. rest of class
> end
>
> puts Module::doc(Example)
>
>
> Produces:
>
> Example:
> This is a sample documentation string
>
>
> But
>
> class Module
> @@docs = {}
> # Invoked during class definitions
> def doc(str)
> @@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
> end
> # invoked to get documentation
> def Module::doc(aClass)
> # If we're passed a class or module, convert to string
> # ('<=' for classes checks for same class or subtype)
> aClass = aClass.name if aClass.class <= Module
> @@docs[aClass] || "No documentation for #{aClass}"
> end
> end
> class Example<Module
> doc("This is a sample documentation string")
>
> # .. rest of class
> end
>
> puts Module::doc(Example)
>
> Produces:
>
> No documentation for Example
>
>
> Can anybody tell me why?

When you do this:

class Example < Module
doc("string")
end

the doc method you're calling is Module.doc. The object Example has
two doc methods in its method lookup path, and that's the one it hits
first.

If you change Module.doc to Module.show_doc (or whatever), you'll see
the difference.


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
See http://www.r... for details and updates!

Wesley Silva

5/31/2008 11:26:00 PM

0

Thanks a lot David!

I would like to make another question please...:)

If i just change Modules's name for Father for example:

class Father
@@docs = {}
def doc(str)
@@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
end
def Father::show_doc(aClass)
aClass = aClass.name if aClass.class <= Module
@@docs[aClass] || "No documentation for #{aClass}"
end
end
class Example<Father
doc("This is a sample documentation string")
end

puts Father::show_doc(Example)

Produces:

undefined method `doc' for Example:Class (NoMethodError)

Can you tell why? :)


--
Posted via http://www.ruby-....

David A. Black

6/1/2008 12:16:00 AM

0

Hi --

On Sun, 1 Jun 2008, Wesley Silva wrote:

> Thanks a lot David!
>
> I would like to make another question please...:)
>
> If i just change Modules's name for Father for example:
>
> class Father
> @@docs = {}
> def doc(str)
> @@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
> end
> def Father::show_doc(aClass)
> aClass = aClass.name if aClass.class <= Module
> @@docs[aClass] || "No documentation for #{aClass}"
> end
> end
> class Example<Father
> doc("This is a sample documentation string")
> end
>
> puts Father::show_doc(Example)
>
> Produces:
>
> undefined method `doc' for Example:Class (NoMethodError)
>
> Can you tell why? :)

doc is an instance method of Father, and Example is not an instance of
Father (it's an instance of Class). So you can't call doc on Example.


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
See http://www.r... for details and updates!

Robert Klemme

6/1/2008 9:31:00 AM

0

On 01.06.2008 02:16, David A. Black wrote:
> Hi --
>
> On Sun, 1 Jun 2008, Wesley Silva wrote:
>
>> Thanks a lot David!
>>
>> I would like to make another question please...:)
>>
>> If i just change Modules's name for Father for example:
>>
>> class Father
>> @@docs = {}
>> def doc(str)
>> @@docs[self.name] = self.name + ":\n" + str.gsub(/^\s+/, '')
>> end
>> def Father::show_doc(aClass)
>> aClass = aClass.name if aClass.class <= Module
>> @@docs[aClass] || "No documentation for #{aClass}"
>> end
>> end
>> class Example<Father
>> doc("This is a sample documentation string")
>> end
>>
>> puts Father::show_doc(Example)
>>
>> Produces:
>>
>> undefined method `doc' for Example:Class (NoMethodError)
>>
>> Can you tell why? :)
>
> doc is an instance method of Father, and Example is not an instance of
> Father (it's an instance of Class). So you can't call doc on Example.

Wesley, IMHO there is an easier as well as safer solution: safer,
because a class's name may be unset. Also, your solution keeps
documentation of all classes in memory even if they are GC'ed (if that's
possible, I am not sure). So here's what I'd do:

class Module
def doc(str = nil)
if str
@doc = (name + ":\n" + str.strip).freeze
else
@doc
end
end
end

Kind regards

robert

David Masover

6/2/2008 5:10:00 AM

0

On Sunday 01 June 2008 04:34:33 Robert Klemme wrote:
> Also, your solution keeps
> documentation of all classes in memory even if they are GC'ed (if that's
> possible, I am not sure).

I hope it's possbile to GC a class, otherwise Class#new can be a memory leak.