Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中的模块中创建类级方法_Ruby - Fatal编程技术网

在Ruby中的模块中创建类级方法

在Ruby中的模块中创建类级方法,ruby,Ruby,为什么这样不行 module Greeter def self.greet puts "anyang" end end Greeter.greet # => anyang class KoreanKid include Greeter greet end # !> NameError : undefined local variable or method `greet' for KoreanKid:Class KoreanKid.greet # !

为什么这样不行

module Greeter
  def self.greet
    puts "anyang"
  end
end

Greeter.greet # => anyang

class KoreanKid
  include Greeter
  greet
end

# !> NameError : undefined local variable or method `greet' for KoreanKid:Class

KoreanKid.greet

# !> NoMethodError : undefined method `greet' for KoreanKid:Class
当我在KoreanKid类内部调用
greet
时,这只是简单地调用一个类方法,对吗?这和韩国小孩一样。问候一下,对吗?为什么上述方法不起作用

在我的模块中,我将混合使用类方法和实例方法。。。如何使这两种方法都干净地工作?

内核#include
将模块中的现有方法添加为类的实例方法。要添加类方法,必须使用
Kernel#extend

module Foo
  def bar
    42
  end
end

class Baz
  extend Foo
end

Baz.bar # => 42
请注意,我们扩展的方法是原始模块中的实例方法


实现这两种功能的常用方法是使用包含的
模块#
钩子来扩展:

module Foo
  def bar
    :wut
  end

  def self.included(target)
    target.extend ClassMethods
  end

  module ClassMethods
    def baz
      :indeed
    end
  end
end

class Test
  include Foo
end

Test.new.bar # => :wut
Test.baz     # => :indeed