Ruby 我尝试使用模块将我自己的方法添加到数组类中(但不重写它)
和模块结构:Ruby 我尝试使用模块将我自己的方法添加到数组类中(但不重写它),ruby,Ruby,和模块结构: class Check include TestParser # so on end 我想要实现的是,check.rb文件中的每个数组都可以通过parse\u test方法调用 我哪里弄错的?(抛出未定义的方法错误)您已经定义了一个新类TestParser::Array包含parse\u test方法;您尚未修改数组类 您还可能会混淆模块和包含 如果您的目标是将方法parse\u test添加到Ruby程序中的数组中,则可以将其放入名为test\u parser.rb的
class Check
include TestParser
# so on
end
我想要实现的是,check.rb文件中的每个数组都可以通过parse\u test
方法调用
我哪里弄错的?(抛出未定义的方法错误)您已经定义了一个新类
TestParser::Array
包含parse\u test
方法;您尚未修改数组
类
您还可能会混淆模块和包含
如果您的目标是将方法parse\u test
添加到Ruby程序中的数组中,则可以将其放入名为test\u parser.rb
的文件中,而无需模块声明:
module TestParser
class Array
def parse_test
# method
end
end
end
但这将修改基本数组类,您说过不想这样做。此外,只要文件require
d,它就会进行修改。没有必要包括在内
除了目前实验性的Ruby 2.0特性“改进”之外,没有办法将这些修改局限于基类(称为“猴子补丁”)
如果您希望数组的行为有所不同,但只是在代码中,那么最好的办法是定义自己的类来扩展数组(也就是说,将其作为容器类包装并委托给常规的数组
,或者如果您认为必须的话,将其作为子类).您已经定义了一个新类TestParser::Array
,其中包含parse\u test
方法;您尚未修改数组
类
您还可能会混淆模块和包含
如果您的目标是将方法parse\u test
添加到Ruby程序中的数组中,则可以将其放入名为test\u parser.rb
的文件中,而无需模块声明:
module TestParser
class Array
def parse_test
# method
end
end
end
但这将修改基本数组类,您说过不想这样做。此外,只要文件require
d,它就会进行修改。没有必要包括在内
除了目前实验性的Ruby 2.0特性“改进”之外,没有办法将这些修改局限于基类(称为“猴子补丁”)
如果您希望数组的行为有所不同,但只是在代码中,那么最好的办法是定义自己的类来扩展数组(也就是说,让它成为一个容器类,包装并委托给一个常规的数组,或者如果您觉得必须的话,也可以是一个子类)。您要寻找的是。请注意,此功能是实验性的:
class Array
def parse_test
# method
end
end
您还可以从数组继承并添加您的方法:
module TestParser
refine Array do
def parse_test
42
end
end
end
using TestParser # This applies only to the current file
class Check
[].parse_test #=> 42
end
最后,关于您所拥有的不起作用的原因:
class TestParser
def initialize array = []
@array = array
end
def parse_test
# do stuff to @array
end
end
创建两个对象:一个没有方法的模块TestParser
,一个只有一个方法的类TestParser::Array
(parse\u test
)。因为TestParser
没有方法,所以将它包含到另一个模块/类中对可用的方法没有影响。包含TestParser
对TestParser::Array
没有任何作用。请注意,此功能是实验性的:
class Array
def parse_test
# method
end
end
您还可以从数组继承并添加您的方法:
module TestParser
refine Array do
def parse_test
42
end
end
end
using TestParser # This applies only to the current file
class Check
[].parse_test #=> 42
end
最后,关于您所拥有的不起作用的原因:
class TestParser
def initialize array = []
@array = array
end
def parse_test
# do stuff to @array
end
end
创建两个对象:一个没有方法的模块TestParser
,一个只有一个方法的类TestParser::Array
(parse\u test
)。因为TestParser
没有方法,所以将它包含到另一个模块/类中对可用的方法没有影响。包含TestParser
对TestParser::Array
没有任何作用
我想要实现的是,文件check.rb中的每个数组都可以
由parse_测试方法调用
您只需知道如何创建阵列:
module TestParser
class Array
def parse_test; end
end
end
当然,TestParser::Array类没有在Array类中找到的任何方法:
module TestParser
class Array
def parse_test
puts 'hello'
end
end
end
class Check
include TestParser
Array.new.parse_test
def do_stuff
Array.new.parse_test
end
end
Check.new.do_stuff
Check::Array.new.parse_test
--output:--
hello
hello
hello
当在Check中找不到常量时,ruby会沿着继承链查找该常量:
class AnonymousClass
class Array
def parse_test
puts 'hello'
end
end
end
class Check < AnonymousClass
Array.new.parse_test
end
对于这场胜利*:
module TestParser
class Array
def parse_test
puts 'hello'
end
end
end
class Check
include TestParser
p Array
p ::Array
end
--output:--
TestParser::Array
Array
*致命一击:结束重伤者或动物痛苦的致命一击
我想要实现的是,文件check.rb中的每个数组都可以
由parse_测试方法调用
您只需知道如何创建阵列:
module TestParser
class Array
def parse_test; end
end
end
当然,TestParser::Array类没有在Array类中找到的任何方法:
module TestParser
class Array
def parse_test
puts 'hello'
end
end
end
class Check
include TestParser
Array.new.parse_test
def do_stuff
Array.new.parse_test
end
end
Check.new.do_stuff
Check::Array.new.parse_test
--output:--
hello
hello
hello
当在Check中找不到常量时,ruby会沿着继承链查找该常量:
class AnonymousClass
class Array
def parse_test
puts 'hello'
end
end
end
class Check < AnonymousClass
Array.new.parse_test
end
对于这场胜利*:
module TestParser
class Array
def parse_test
puts 'hello'
end
end
end
class Check
include TestParser
p Array
p ::Array
end
--output:--
TestParser::Array
Array
*恩典政变:结束重伤者或动物痛苦的致命一击你说的“不推翻它”是什么意思?数组中已经没有方法parse\u test
,所以没有什么可以重写的。我的意思是,根本不重写数组类。是否要执行class-Array<::Array
,然后使用TestParser::Array
声明扩展数组?什么意思是“不重写它”?数组中已经没有方法parse\u test
,因此没有什么可以重写的。我的意思是,根本不重写数组类。是否要执行class-Array<::Array
,然后使用TestParser::Array
声明扩展数组?