函数的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
,因此这将简单地提高aNoMethodError
调用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类继承的理解有点偏离了