tag samp rails ruby module mixins

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.