函数的Ruby模块

函数的Ruby模块,ruby,methods,module,Ruby,Methods,Module,可以使用模块将方法添加到类中。例如: class Test include Singleton end class Test include Singleton end 方法是否也可以这样做?例如: class Test include Singleton def test include Instructions_to_add_to_the_method puts 'done' end end class Test include Singlet

可以使用模块将方法添加到类中。例如:

class Test
  include Singleton
end
class Test
  include Singleton
end
方法是否也可以这样做?例如:

class Test
  include Singleton

  def test
    include Instructions_to_add_to_the_method
    puts 'done'
  end
end
class Test
  include Singleton

  def test
    include Instructions_to_add_to_the_method
    puts 'done'
  end
end
其中:

module Instructions_to_add_to_the_method
  puts 'hi !'
end
调用
Test.instance.Test
时,我需要:

hi !
done
hi !
done

我不想调用另一个方法,因为它会给我的变量范围带来问题。

这可能是一个糟糕的想法。在运行时搞乱类会使问题难以调试(我在那里调用的是该方法的哪个版本?)和代码难以遵循(哦,对了,我还不能调用该方法,因为它还没有定义,我需要先调用该方法)

考虑到你在关于变量作用域的问题结束时所说的,我几乎可以肯定这不会解决你实际遇到的问题,我建议你把你的实际问题公布出来

也就是说,可以使用
included
extended
钩子来回答您提出的问题,毫不奇怪,当模块被包含和扩展时,钩子会触发:


模块foodmodule
def自带(基本)
放入“包含模块”
结束
def自我扩展(基本)
将“FooModule扩展”
结束
def新方法
放置“调用新方法”
结束
结束
类扩展器
def测试扩展
self.extend模块
完成
结束
结束
类包括
def测试_包括
self.class.include模块
完成
结束
结束
t1=Extender.new
t2=扩展器。新
t1.test_extend#打印出“foodule extended”,后跟“done”
t1.new#方法#打印出“调用的新方法”
t2.new_方法rescue put'error'#打印出“error”-extend只修改调用它的实例
t1=Includer.new
t2=包括新的
t1.test_include#打印出“包含模块”后接“完成”
t1.new#方法#打印出“调用的新方法”
t2.new_method#打印出“new method called”-Includer的所有过去和未来实例都已修改
可以使用模块将方法添加到类中。例如:

class Test
  include Singleton
end
class Test
  include Singleton
end
否。这不会“向类添加方法”
include
简单地将
Singleton
作为
Test
的超类。没别的了。没有任何内容被“添加到类”。这只是继承

方法是否也可以这样做?例如:

class Test
  include Singleton

  def test
    include Instructions_to_add_to_the_method
    puts 'done'
  end
end
class Test
  include Singleton

  def test
    include Instructions_to_add_to_the_method
    puts 'done'
  end
end
没有方法
Test#include
,因此这将简单地
提高
a
NoMethodError

调用
Test.instance.Test
时,我需要:

hi !
done
hi !
done
这就是继承的意义:

class Test
  include Singleton

  def test
    super
    puts 'done'
  end
end

module Instructions_to_add_to_the_method
  def test
    puts 'hi'
  end
end

class Test
  include Instructions_to_add_to_the_method
end

Test.instance.test
# hi
# done
注意,这种在Ruby中使用继承的方式有点落后。如果您真的需要这样的东西,您应该使用像Beta这样的语言,这就是继承自然工作的方式

更好的解决方案是类似的,在Ruby中,它可以是像
yield
ing到一个块这样简单的东西:

class Test
  include Singleton

  def test
    yield
    puts 'done'
  end
end

Test.instance.test { puts 'hi' }
# hi
# done
或者将
Proc
作为参数:

class Test
  include Singleton

  def test(prc)
    prc.()
    puts 'done'
  end
end

Test.instance.test(-> { puts 'hi' })
# hi
# done
或者通过调用钩子方法:

class Test
  include Singleton

  def test
    extension_hook
    puts 'done'
  end

  def extension_hook; end
end

class HookedTest < Test
  def extension_hook
    puts 'hi'
  end
end

HookedTest.instance.test
# hi
# done
类测试
包括独生子女
def测试
延长钩
完成
结束
def延长钩;结束
结束
等级HookedTest
我不希望调用另一个方法,因为它会给我的变量范围带来问题


代码中没有变量,因此不可能有任何“问题”。

不,ruby不是这样工作的。模块不是宏。您可以将
Module#prepend
Module#include
super
结合使用,如果这正是您试图实现的目标的话?非常感谢您的回答,似乎我对Ruby类继承的理解有点偏离了