M
Minkoo Seo
Hi group.
This is a question on metaprogramming in Ruby.
What's the difference between define_method
symbol) and defining a
class using def ..;end? As an example,
irb(main):001:0> class Foo; end
=> nil
irb(main):002:0> Foo.instance_eval do
irb(main):003:1* define_method
bar) do
irb(main):004:2* puts "bar"
irb(main):005:2> end
irb(main):006:1> end
=> #<Proc:0x02ce7d48@(irb):3>
irb(main):007:0> Foo.bar
NoMethodError: undefined method `bar' for Foo:Class
from (irb):7
irb(main):008:0> Foo.new.bar
bar
=> nil
irb(main):009:0> Foo.instance_eval do
irb(main):010:1* def baz
irb(main):011:2> puts "baz"
irb(main):012:2> end
irb(main):013:1> end
=> nil
irb(main):014:0> Foo.baz
baz
=> nil
irb(main):015:0> f.baz
NameError: undefined local variable or method `f' for main:Object
from (irb):15
Foo is an instance of Class. Therefore, defining methods taking Foo as
an instance (of Class) must introduce class method. Right? But the
above example shows that it also depends on whether define_method is
called or def is used.
What's difference? Why does Foo.bar is not defined when I use
define_method?
Sincerely,
Minkoo Seo
This is a question on metaprogramming in Ruby.
What's the difference between define_method
class using def ..;end? As an example,
irb(main):001:0> class Foo; end
=> nil
irb(main):002:0> Foo.instance_eval do
irb(main):003:1* define_method
irb(main):004:2* puts "bar"
irb(main):005:2> end
irb(main):006:1> end
=> #<Proc:0x02ce7d48@(irb):3>
irb(main):007:0> Foo.bar
NoMethodError: undefined method `bar' for Foo:Class
from (irb):7
irb(main):008:0> Foo.new.bar
bar
=> nil
irb(main):009:0> Foo.instance_eval do
irb(main):010:1* def baz
irb(main):011:2> puts "baz"
irb(main):012:2> end
irb(main):013:1> end
=> nil
irb(main):014:0> Foo.baz
baz
=> nil
irb(main):015:0> f.baz
NameError: undefined local variable or method `f' for main:Object
from (irb):15
Foo is an instance of Class. Therefore, defining methods taking Foo as
an instance (of Class) must introduce class method. Right? But the
above example shows that it also depends on whether define_method is
called or def is used.
What's difference? Why does Foo.bar is not defined when I use
define_method?
Sincerely,
Minkoo Seo