简体   繁体   中英

Simultaneously creating instance and class methods with the same name in a ruby class

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM