Dak*_*kar 43 ruby module mixins
我正在尝试使用Ruby模块(mixins).
我有test.rb:
#!/usr/bin/env ruby
require_relative 'lib/mymodule'
class MyApp
include MyModule
self.hallo
end
Run Code Online (Sandbox Code Playgroud)
和lib/mymodule.rb:
module MyModule
def hallo
puts "hallo"
end
end
Run Code Online (Sandbox Code Playgroud)
非常简单的设置.但它不起作用:(:
ruby test.rb
test.rb:8:in `<class:MyApp>': undefined method `hallo' for MyApp:Class (NoMethodError)
from test.rb:6:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我的错误在哪里?
Kyl*_*yle 71
简而言之:您需要extend
代替include
模块.
class MyApp
extend MyModule
self.hallo
end
Run Code Online (Sandbox Code Playgroud)
include
为混合它的类提供实例方法.
extend
为混合它的类提供类方法.
给这个读一读.
小智 11
问题是您hallo
在类定义中调用,而将其添加为实例方法(include
).
所以你可以使用extend
(hallo
将成为一个类方法):
module MyModule
def hallo
puts "hallo"
end
end
class MyApp
extend MyModule
self.hallo
end
Run Code Online (Sandbox Code Playgroud)
或者调用hallo
MyApp实例:
module MyModule
def hallo
puts "hallo"
end
end
class MyApp
include MyModule
end
an_instance = MyApp.new
an_instance.hallo
Run Code Online (Sandbox Code Playgroud)
您的代码正在运行 - 但包含模块并不能完成您的想法.包含模块的类将不会获取方法 - 此类中的对象将是.
所以这将有效:
class MyApp
include MyModule
end
my_app_object = MyApp.new
my_app_object.hallo # => hallo
Run Code Online (Sandbox Code Playgroud)
my_app_object是MyApp类的一个对象,它有一个模块MyModule的混合.看看那里有模块和mixins的完整解释.