gpt4 book ai didi

ruby - 如何使用模块修补一个类?

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:24 25 4
gpt4 key购买 nike

我有几个文件。其中一个我想扩展一些 Ruby 类,例如

module Stylable
class Array
def styled
"\n" << "*"*72 << self.to_s << "*"*72 << "\n"
end
end
end

在另一个文件中,我定义了一个类并混入了我的自定义模块。

require './stylable'

class Printer
include Stylable

def initialize(object)
@object = object
end

def print
puts @object.styled
end
end

Printer.new([1,2,3]).print

出于某种原因,我无法使用自定义的 Array#styled 方法:

$ ruby printer.rb 
printer.rb:10:in `print': undefined method `styled' for [1, 2, 3]:Array (NoMethodError)
from array_printer.rb:14:in `<main>'

我做错了什么?

编辑:虽然下面@MarekLipka 的解决方案适用于 Ruby 2+。我必须在 Ruby 1.9.3/Rails 3 上执行此操作。有没有办法执行此操作,或者我必须使用没有模块包装器的全局类扩展?

最佳答案

您正在寻找类似 refinements 的特征:

风格化.rb:

module Stylable
refine Array do
def styled
"\n" << "*"*72 << self.to_s << "*"*72 << "\n"
end
end
end

打印机.rb:

require './stylable'
class Printer
using Stylable
# ...
end
Printer.new([1,2,3]).print

使用改进的好处是这个猴子补丁只在 Printer 类的范围内工作,所以它不太可能破坏某些东西。

你原来的方法不起作用的原因是你实现了一个新的 Stylable::Array 类,而不是猴子修补 ::Array 类(注意命名空间)。

如果您正在运行 Ruby < 2.0 并且您不想在全局范围内对 Array 进行猴子修补,您可以创建继承自数组的自定义类:

class StylableArray < Array
def styled
"\n" << "*"*72 << self.to_s << "*"*72 << "\n"
end
end

并在您的 Printer 文件中使用它:

Printer.new(StylableArray.new([1,2,3]))

另一种方法是全局猴子修补Array,不推荐这种方法。

关于ruby - 如何使用模块修补一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28238320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com