[英]Adding methods to base ruby class in rails
我有一个非常简单的模块Utility
,在rails应用的lib目录中的utility.rb
中定义。 它只是向Ruby标准库中的类添加了两个简单的方法。
但是,当我require
此文件时,其中的类不会响应我在此处定义的方法。 例如, [].concat_with
失败,并显示NoMethodError
。 为什么?
module Utility
#
# This module just contains useful functions
#
class Array
def concat_with(seperator = "")
reject! { |c| c.empty? }.join(seperator)
end
end
class Float
def flat
"%gx" % (self / 100.00)
end
end
end
那是因为您定义了新类,而不是修补现有类。 这些类是Utility::Array
和Utility::Float
。 在module
子句中,所有内容都在模块的范围内。
在Ruby 2.0中,添加了一些改进 ,以允许对现有类进行临时修补,这看起来像您的情况:
module Utility
#
# This module just contains useful functions
#
refine Array do
def concat_with(seperator = "")
reject! { |c| c.empty? }.join(seperator)
end
end
refine Float do
def flat
"%gx" % (self / 100.00)
end
end
end
然后,您执行以下操作:
using Utility # Obviously, it has to be `required`
puts 3.14.flat
这些方法仅存在于当前范围内。 一旦您走出去,它们就会消失。
当然,您可以从模块外部引用类,如下所示:
module Utility
#
# This module just contains useful functions
#
class ::Array
def concat_with(seperator = "")
reject! { |c| c.empty? }.join(seperator)
end
end
class ::Float
def flat
"%gx" % (self / 100.00)
end
end
end
但这将永久地(在过程方面)写入更改。 有时这可能是合乎需要的,但除非绝对必要,否则我会避免这样做,因为它很容易与其他库所做的更改冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.