我想创建一个全局String
方法,用作:"string".convert_to_date
,我可以像"abc".length
或"abc".upcase
一样使用它。
如何定义convert_to_date
方法?
答案 0 :(得分:9)
作为修补的替代方法,您还可以通过优化来定义修补程序。这将使补丁仅在某个范围内可用。这不一定是String.convert_to_date
的问题,但在大型项目中,经常建议避免直接的monkeypatching,以避免与宝石发生冲突。代码。
如此定义和使用细化:
module StringRefinement
refine String do
def convert_to_date
self + " world"
end
end
end
class SomeClass
using StringRefinement
"hello".convert_to_date # => "hello world"
end
"hello".convert_to_date # => NoMethodError
答案 1 :(得分:6)
你可以在ruby中打开任何类来添加方法,对于你的情况你可以做
class String
def convert_to_date
# do something with the string, self will contain the value of the string
end
end
这将使该方法可用于任何字符串对象,因此请确保您知道自己在做什么并且没有副作用。
这称为猴子修补,我不确定这是否是没有更多上下文的用例的最佳方式
如果您只是想将字符串日期转换为日期或时间对象,那么已经存在Time.parse
或DateTime.parse
等方法
答案 2 :(得分:-2)
感谢@Subash和@max pleaner,您的回答帮助我找到了解决方案。这是我的解决方案:
在config / initializers / StringRefinementDate.rb中:
module StringRefinementDate
def convert_to_date
self + " world"
end
end
String.include StringRefinementDate
在models
,controllers
和views
中,只需使用:
"hello".convert_to_date # => "hello world"