const_missing

  • Thread starter Elias Athanasopoulos
  • Start date
E

Elias Athanasopoulos

Hello!

I want to create class methods at run-time, so I use
Object#const_missing. But, I must to know the name of
the class method which was called. Is there a way to do
this via the Ruby C API (or in Ruby in general)?

I.e. when the user calls Foo.bar, I need to know (inside
const_missing) that somebody tried to call the class
method 'bar' of Foo.

Regards,
 
J

Joel VanderWerf

Elias said:
Hello!

I want to create class methods at run-time, so I use
Object#const_missing. But, I must to know the name of
the class method which was called. Is there a way to do
this via the Ruby C API (or in Ruby in general)?

I.e. when the user calls Foo.bar, I need to know (inside
const_missing) that somebody tried to call the class
method 'bar' of Foo.

Is this what you want?

class Object
def self.const_missing(name)
const_set(name, kl = Class.new)
class << kl
def method_missing(m, *args)
puts "tried to call #{m} in #{self}"
end
end
kl
end
end

Foo.bar # ==> tried to call bar in Foo
 
D

David A. Black

Hi --

Hello!

I want to create class methods at run-time, so I use
Object#const_missing. But, I must to know the name of
the class method which was called. Is there a way to do
this via the Ruby C API (or in Ruby in general)?

I.e. when the user calls Foo.bar, I need to know (inside
const_missing) that somebody tried to call the class
method 'bar' of Foo.

Interesting question, but I suspect the answer is that you can't.
const_missing is called when "Foo" is encountered -- which means no
one has tried to call "bar"; execution didn't get that far.

That's my reasoning, anyway. You may get more mileage from other
answers.


David
 
D

David A. Black

Hi --

Is this what you want?

class Object
def self.const_missing(name)
const_set(name, kl = Class.new)
class << kl
def method_missing(m, *args)
puts "tried to call #{m} in #{self}"
end
end
kl
end
end

Foo.bar # ==> tried to call bar in Foo

*Much* cooler than my answer! :)


David
 
R

Richard Dale

David said:
Hi --



*Much* cooler than my answer! :)

Or in C:

static VALUE
class_method_missing(int argc, VALUE * argv, VALUE klass)
{
char * methodName = rb_id2name(SYM2ID(argv[0]));
....

-- Richard
 
E

Elias Athanasopoulos

Hello!

Or in C:

static VALUE
class_method_missing(int argc, VALUE * argv, VALUE klass)
{
char * methodName = rb_id2name(SYM2ID(argv[0]));
....

Right. This is exactly what I was looking for. Thanks a lot
(to the other posters also).

Regards,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,763
Messages
2,569,562
Members
45,038
Latest member
OrderProperKetocapsules

Latest Threads

Top