[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Fwd: [EVALUATION] - E03 - jamLang Evaluation Case Applied to Ruby

James Gray

3/25/2005 3:08:00 PM

Begin forwarded message:

>> # reflection
>> class Talker
>> # simple
>> def sayYourClassName
>> puts self.class.name # the 'self' is optional here
>> end
>
> omitting "self" (puts class.name) leads to an error

I checked this one myself, because it surprised me when you said it.
You're right of course. I'm assuming it's because class is a method
name and a Ruby keyword.

>> # advanced
>> # caller returns a stack (array) of strings of the form #
>> file:linenumber in `method'
>> # so we extract the most recent one and parse the method name out
>> # code from PLEAC
>> def thisMethodName
>> caller[0] =~ /in `([^']+)'/ ? $1 : '(anonymous)';
>> end
>
> I understand the concept.
>
> is there possibly a more direct solution available, with cleaner code
> and a stable/higher execution speed?

Have you measured it and proven it too slow? Remember, premature
optimization is the root of all evil in programming. ;)

I'm not sure what you consider "clean", but getting rid of the ternary
operator may make it a little more readable:

if caller[0] =~ /in `([^']+)'/ then $1 else '(anonymous)' end

>> # expert
>> def sayYourClassDefinition
>> puts "Class:"
>> sayYourClassName
>
> puts "Class #{self.class.name}" >> Class Talker
>
> but
>
> puts "Class #{sayYourClassName}" >> Talker Class
> puts "Class " + sayYourClassName.to_s >> Talker Class
>
> why?

In the first example, you're asking Ruby for the class name, which you
add to a string that gets printed by the local call to puts. In the
other two, you're calling a method that prints the class name
immediately. Then the local puts prints "Class " and the return value
from the method call, which isn't meaningful in this context.

>> # %{} is another way to write a string literal
>
> #{} - inside strings
> %{} - outside of strings

No, these are not equivalent. #{...} is for interpolating Ruby code
inside a string. %{...} defined a double quoted string, without the
quotes:

%{This is a string. I can use "quotes" in here. And #{"interpolate"}
values.}

>> # (looks neat for multiline strings)
>> # we use the standard 'inspect' method to print out arrays of
>> # method names in a ["meth1", "meth2", ...] format
>> puts %{
>> Methods:
>> public:
>> #{public_methods.inspect}
>> protected
>> #{protected_methods.inspect}
>> private:
>> #{private_methods.inspect}
>> non-inherited:
>> #{(methods - self.class.superclass.instance_methods).inspect}
>> Instance Variables:
>> #{instance_variables.inspect}
>> }
>
> Can I get somehow a more precise reflection of the class definition
> (output similar to the original class-def, excluding code)?

I don't believe so, no. Remember that a Ruby class can be reopened and
definitions added to it. That means a class could be built up from
many places.

Ruby does have a means to get it to store the source code it reads, but
I don't believe that's what you were asking for.

James Edward Gray II



2 Answers

Florian Gross

3/25/2005 3:29:00 PM

0

James Edward Gray II wrote:

>>> def thisMethodName
>>> caller[0] =~ /in `([^']+)'/ ? $1 : '(anonymous)';
>>> end
>>
>> I understand the concept.
>>
>> is there possibly a more direct solution available, with cleaner code
>> and a stable/higher execution speed?
>
> Have you measured it and proven it too slow? Remember, premature
> optimization is the root of all evil in programming. ;)
>
> I'm not sure what you consider "clean", but getting rid of the ternary
> operator may make it a little more readable:
>
> if caller[0] =~ /in `([^']+)'/ then $1 else '(anonymous)' end

Hm, perhaps even this:

caller.first[/in `(.+?)'/, 1] || "(anonymous")

Don't know if you'd prefer that, though.

Ilias Lazaridis

3/26/2005 1:32:00 AM

0

Florian Gross wrote:
> James Edward Gray II wrote:
[...]
>> if caller[0] =~ /in `([^']+)'/ then $1 else '(anonymous)' end
>
> Hm, perhaps even this:
>
> caller.first[/in `(.+?)'/, 1] || "(anonymous")
>
> Don't know if you'd prefer that, though.

[looks nicer.]

please (for archive integrity reasons) use the original thread for
further discussion:

[EVALUATION] - E03 - jamLang Evaluation Case Applied to Ruby
http://groups-beta.google.com/group/comp.lang.ruby/browse_thread/thread/78501a...

I've answered therein.

.

--
http://laz...