Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我尝试使用模块将我自己的方法添加到数组类中(但不重写它)_Ruby - Fatal编程技术网

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
声明扩展数组?