如何创建全局字符串方法

时间:2018-06-06 02:48:40

标签: ruby methods

我想创建一个全局String方法,用作:"string".convert_to_date,我可以像"abc".length"abc".upcase一样使用它。

如何定义convert_to_date方法?

3 个答案:

答案 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.parseDateTime.parse等方法

答案 2 :(得分:-2)

感谢@Subash和@max pleaner,您的回答帮助我找到了解决方案。这是我的解决方案:

在config / initializers / StringRefinementDate.rb中:

module StringRefinementDate
  def convert_to_date
    self + " world"
  end
end
String.include StringRefinementDate

modelscontrollersviews中,只需使用:

"hello".convert_to_date # => "hello world"