Consider;
- - -
class Dance
def foo
puts "foo is executed"
42
end
end
class Boogy < Dance
def bar
puts (foo.class)
end
end
b = Boogy.new
b.foo # prints "foo is executed" ... expected.
b.bar # prints "foo is executed\nFixnum" ... not expected!
- - -
Let's focus on the line
puts (foo.class)
So let's say I'm in the middle of a debugging session trying to debug the bar method.
I see this thing called "foo" and I want to know what it is.
So I
puts (foo.class)
Since everything in ruby is an object and all objects have classes, I'm expecting to print out the class of this thing called foo.
You do not want the class but rather the kind of "foo". "local
variable" is not a class. You can do
irb(main):032:0> class Bogey < Dance
irb(main):033:1> def bar
irb(main):034:2> a=0
irb(main):035:2> printf "foo -> %p\n", defined?(foo)
irb(main):036:2> printf "a -> %p\n", defined?(a)
irb(main):037:2> printf "none -> %p\n", defined?(none)
irb(main):038:2> end
irb(main):039:1> end
=> nil
irb(main):040:0> Bogey.new.bar
foo -> "method"
a -> "local-variable"
none -> nil
=> nil
What happens, though is that foo gets executed (which is not what I want) and returns 42 ... whose class is Fixnum.
Questions:
How can I tell what class of object foo is without executing it?
if you see "foo=" it's a local variable, if not it's a method or does
not exist. If your method is so long that you cannot find anything
any more you need to refactor.
Is there a class called "Method" in the Ruby class hierarchy?
irb(main):001:0> m = 1.method :to_s
=> #<Method: Fixnum#to_s>
irb(main):002:0> m.unbind
=> #<UnboundMethod: Fixnum#to_s>
What class of object does define_method return?
Why don't you try and see? It's as easy as
irb(main):004:0> x = Fixnum.send(:define_method, :foo) { 123 }
=> #<Proc:0x8666c84@(irb):4 (lambda)>
irb(main):005:0> x.class
=> Proc
irb(main):006:0> class Fixnum
irb(main):007:1> define_method(:bar){ 786 }
irb(main):008:1> end
=> #<Proc:0x8613840@(irb):7 (lambda)>
Cheers
robert
···
On Tue, Mar 6, 2012 at 5:34 PM, Ralph Shnelvar <ralphs@dos32.com> wrote:
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/