samp - Ruby: módulo, requiere e incluye
ruby on rails html (4)
El problema es que llamas a hallo
en la definición de clase, mientras que lo agregas como un método de instancia ( include
).
Entonces, podrías usar extend
( hallo
se convertiría en un método de clase):
module MyModule
def hallo
puts "hallo"
end
end
class MyApp
extend MyModule
self.hallo
end
O llame a hallo
en una instancia de MyApp:
module MyModule
def hallo
puts "hallo"
end
end
class MyApp
include MyModule
end
an_instance = MyApp.new
an_instance.hallo
Estoy tratando de usar módulos de Ruby (mixins).
Tengo test.rb:
#!/usr/bin/env ruby
require_relative ''lib/mymodule''
class MyApp
include MyModule
self.hallo
end
y lib / mymodule.rb:
module MyModule
def hallo
puts "hallo"
end
end
Configuración bastante simple. Pero no funciona :( :
ruby test.rb
test.rb:8:in `<class:MyApp>'': undefined method `hallo'' for MyApp:Class (NoMethodError)
from test.rb:6:in `<main>''
¿Dónde está mi error?
En resumen: necesita extend
lugar de include
el módulo.
class MyApp
extend MyModule
self.hallo
end
include
proporciona métodos de instancia para la clase que lo mezcla.
extend
proporciona métodos de clase para la clase que lo mezcla.
Dale una lectura.
Tu código funciona, pero incluir un módulo no hace lo que crees que hace. La clase que incluye el módulo no obtendrá los métodos, los objetos de esta clase sí lo harán.
Entonces esto funcionará
class MyApp
include MyModule
end
my_app_object = MyApp.new
my_app_object.hallo # => hallo
my_app_object es un objeto de la clase MyApp, que tiene un mixins del módulo MyModule. Eche un vistazo there para una explicación completa de los módulos y mixins.
class MyApp
class << self
include MyModule
end
self.hallo
end
es lo mismo que
class MyApp
extend MyModule
self.hallo
end
extends solo abre el objeto de clase e incluye los métodos del módulo. "hola" se convierte en un objeto de clase alias. método estático de la clase MyApp.
Entonces, "incluir" inyectar los métodos a las instancias del receptor, en su caso, ser "propio" NO para el objeto mismo. "extender" inyectar los métodos al receptor en su caso siendo "propio".
self.include MyModule // inject the methods into the instances of self
self.extend MyModule // inject the methods into object self
En el nivel de clase "self" apuntará a su objeto de clase que es MyApp.
También recuerde que "incluir" y "extender" son solo métodos definidos en module.rb. "incluir" es un método de objeto de clase (método estático) y "extender" es un método de instancia.