【问题标题】:Adding a new method to the Array class向 Array 类添加新方法
【发布时间】:2013-07-25 13:02:44
【问题描述】:

我对 Array 对象有新的要求。所以我需要将自己的方法添加到内置的 Array 类中。

如何添加一个新方法,这样无论我创建什么 Array 对象,它都会有我的实例方法?

【问题讨论】:

  • 谷歌“红宝石公开课”
  • 它被称为monkey patching,并且一直在完成。核心类并没有什么特别之处可以阻止您向它们添加方法。

标签: ruby instance


【解决方案1】:

使用Ruby Open Classes:

class Array
  def mymethod
    #implementation
  end
end

【讨论】:

  • 如果我这样做,我以前的数组对象不会内置方法??
  • 它们是内置 Array 的对象,现在成为我的新类 Array 的对象。因此,该对象唯一可用的方法是新添加的实例方法。例如。 uniq 方法不再起作用。当我执行此 object.methods 时,我看到的只是我自己的模块方法(我在其中定义了上面的类 Array)和最初定义 Array 的模块的一些方法。我该怎么走?
  • @user2562153 这不是你的新课程。它仍然是相同的 Array 类,所有构建在 Array 方法中。
  • obj.class=> # Class: X::Y::Z::Array, obj.methods => # Methods: ["==", "===", "=~ ", "id", "send", "class", "clone", "cy_rel_require", "display", "dup", "eql?", "相等?”,“扩展”,“冻结”,“冻结?”,“哈希”,“id”,“检查”,“instance_eval”,“instance_of?”,“instance_variable_defined?”,“instance_variable_get”,“instance_variable_set” 、“instance_variables”、“is_a?”、“kind_of?”、“method”、“methods”、“my_contains_all?”、“nil?”、“object_id”、“private_methods”、“protected_methods”、“public_methods”、“ respond_to?”, “send”, “singleton_methods”, “taint”, “tainted?”, “to_a”, “to_s”, ...
  • 那么你做错了什么,但是,因为你没有在你的问题中包含你正在使用的代码,我们无法帮助修复它。这就是为什么你必须包含代码。这是一个简单的问题,但您必须帮助我们帮助您。由于缺乏有用的信息,人们会投票结束您的问题。
【解决方案2】:

其他答案基本上表明您可以通过重新定义类来向类添加方法,只是添加到该类中,示例可能是这样的:

class Array
    def third
        size > 2 ? self[2] : nil
    end
end

a = [1, 2, 3, 4, 5]

puts a.third

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多