代码之家  ›  专栏  ›  技术社区  ›  Karl

访问类方法,如实例方法

  •  1
  • Karl  · 技术社区  · 15 年前
    class Foo
      def self.bar
        puts "foobar"
      end
    
      def bar
        self.class.bar
      end
    end
    

    我不想定义instance方法 bar . 有没有办法自动使类方法可以作为实例方法访问?也许有一些 method_missing? 魔法?

    2 回复  |  直到 15 年前
        1
  •  1
  •   yfeldblum    15 年前

    尝试以下操作:

    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
    
        2
  •  1
  •   Zargony    15 年前

    最简单的方法是在子模块中定义方法,并将其扩展并包含到类中:

    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
    
    推荐文章