Le 3/4/2005, "Ilias Lazaridis" <ilias / lazaridis.com> a ˝─rit:
>Csaba Henk wrote:
>> On 2005-04-03, Ilias Lazaridis <ilias / lazaridis.com> wrote:
>>
>>>>>def talker
>>>>>
>>>>>  def sayHello
>>>>>    puts "Hello World"
>>>>>  end
>>>>>
>>>>>  def sayYourName
>>>>>    puts @name
>>>>>  end
>>>>>
>>>>>end
>>
>> [snip]
>>
>>>but it gives me the basic idea:
>>>
>>>class Object
>>>   def meta() @meta ||= {} end
>>>end
>>>
>>>talker.sayYourName.meta[:author] = "it's just me"
>>>puts talker.sayYourName.meta[:author]
>>>=> it's just me
>>
>> If you want metadata for the _function_, then it's not exactly the way
>> to go.
>>
>> The sayYourName method, as defined above, is a side-effecting one,
>> writes out @name, then returns nil, which is a unique object, without
>> any reference to talker. That is, it's not a possible carrier of
>> metainformation.
>>
>> What seems to be feasible is implementing one of the following
>> behaviours:
>[...] - (several other suggestions)
>
>I like the extracted construct - and it works in practice.
>
>Thus I'm covered in this point.
>
>Thank you for your suggestions.

Just to make sure there is no confusion:

talker.sayYourName.meta[:author] = "it's just me"

sayYourName, when evaluated, returns nil. Therefore,
your meta structure is actually in the instance of
NilClass, not Talker. You should be able to test it
by trying nil.meta[:author] after you execute the
above code.

You would want to follow the original example,
or do something like this (you can elaborate
on the documentation notation):

class Object
  def doc(str)
    @doc_data ||= {}
    # caller[1] will be the method name doc() was called from.
    @doc_data[caller[1]] = str
  end
end

class SomeClass
  # Some method
  def some_method
    doc "This method does something."
    # ...
  end
end

>http://lazaridis.com

E

No-one expects the Solaris POSIX implementation!