Reputation: 1420
Is there a way for me to simultaneously create a class and an instance method in a ruby class that have the same name?
I have a version of this created in the class Foo
class Foo
def self.bar
"hello world"
end
def bar
self.class.bar
end
end
While this works, is there a more elegant way of achieving this? Right now, I would have to duplicate ~10 methods as instance and class methods.
Upvotes: 8
Views: 1584
Reputation: 6156
you can use Ruby's Forwardable
like this:
# in foo.rb
class Foo
extend Forwardable
def_delegators :Foo, :bar, :baz, :qux
def self.bar
"hello bar"
end
end
then
> Foo.bar #=> "hello bar"
> Foo.new.bar #=> "hello bar"
You can also use method_missing
like this:
class Foo
DelegatedMethods = %i[bar baz qux]
def method_missing(method)
if DelegatedMethods.include? method
self.class.send method
else
super
end
end
def self.bar
"a man walked into a bar"
end
end
Upvotes: 4