Ruby:模块,要求并包含

我正在尝试使用Ruby模块(mixins)。

我有test.rb:

#!/usr/bin/env ruby
require_relative 'lib/mymodule'

class MyApp
  include MyModule
  self.hallo
end

和lib / mymodule.rb:

module MyModule
  def hallo
    puts "hallo"
  end
end

相当简单的设置。 但这不起作用:(:

ruby test.rb
test.rb:8:in `<class:MyApp>': undefined method `hallo' for MyApp:Class (NoMethodError)
        from test.rb:6:in `<main>'

我的错误在哪里?

Dakkar asked 2020-08-12T05:27:09Z
4个解决方案
69 votes

简而言之:您需要使用extend而不是include模块。

class MyApp
  extend MyModule
  self.hallo
end

extend提供了将其混入的类的实例方法。

extend提供了将其混入的类的类方法。

读一读。

Kyle answered 2020-08-12T05:27:28Z
11 votes

问题是,您在类定义中调用了hallo,同时将其添加为实例方法(hallo)。

因此,您可以使用hallohallo将成为类方法):

module MyModule
  def hallo
    puts "hallo"
  end
end

class MyApp
  extend MyModule
  self.hallo
end

或在MyApp实例中致电hallo

module MyModule
  def hallo
    puts "hallo"
  end
end

class MyApp
  include MyModule
end

an_instance = MyApp.new
an_instance.hallo
CCD answered 2020-08-12T05:27:57Z
7 votes

您的代码可以正常工作-但包含模块并不能实现您认为的功能。 包含模块的类将无法获取方法,而该类中的对象将获得方法。

所以这将工作:

class MyApp
  include MyModule
end

my_app_object = MyApp.new
my_app_object.hallo # => hallo

my_app_object是MyApp类的对象,该类具有模块MyModule的mixins。 在那里查看有关模块和混合模块的完整说明。

Martin answered 2020-08-12T05:28:26Z
4 votes
class MyApp
  class << self
    include MyModule
  end
  self.hallo
end

是相同的

class MyApp
  extend MyModule
  self.hallo
end

扩展只打开类对象,并包含模块方法。 “你好”又成为一个类对象。 MyApp类的静态方法。

因此,“包含”将方法注入接收者的实例,在您的情况下是“自身”而不是对象本身。 如果您是“自我”,则“扩展”将方法注入接收方。

self.include MyModule // inject the methods into the instances of self
self.extend MyModule // inject the methods into object self

在类级别,“自我”将指向您的类对象,即MyApp。

还要记住,“ include”和“ extend”只是module.rb中定义的方法。“ include”是类对象方法(静态方法),“ extend”是实例方法。

Viorel answered 2020-08-12T05:29:05Z
translate from https://stackoverflow.com:/questions/15097929/ruby-module-require-and-include