Доступ к методам класса, таким как методы экземпляра - PullRequest
1 голос
/ 06 августа 2010
class Foo
  def self.bar
    puts "foobar"
  end

  def bar
    self.class.bar
  end
end

Я хочу отказаться от определения метода экземпляра bar. Есть ли способ автоматически сделать методы класса доступными как методы экземпляра? Может быть, с некоторой магией method_missing??

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Самый простой способ - определить методы в подмодуле, расширить и включить его в класс:

class Foo

  module FooMethods
    def bar
      puts "foobar"
    end
  end

  # Add methods from module FooMethods as class methods to class Foo
  extend FooMethods

  # Add methods from module FooMethods as instance methods to class Foo
  include FooMethods
end
1 голос
/ 06 августа 2010

Попробуйте что-то вроде:

class Foo

  def self.bar
    puts "foobar"
  end

  def respond_to? name
    super or self.class.respond_to? name
  end

  def method_missing name, *args, &block
    if self.class.respond_to? name
      self.class.send name, *args, &block
    else
      super
    end
  end

end

Вы также можете сделать это (простая версия):

module ChainsToClass
  def respond_to? name
    super or self.class.respond_to? name
  end
  def method_missing name, *args, &block
    if self.class.respond_to? name
      self.class.send name, *args, &block
    else
      super
    end
  end
end

class Foo
  def self.bar
    puts "foobar"
  end
end

Foo.send :include, ChainsToClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...