怎么实现一个!红宝石中的风格方法

时间:2016-12-02 11:29:24

标签: ruby string

在Ruby中,我们有像string.upcase这样的方法,它返回一个新字符串和string.upcase!它修改了调用它的字符串。

我想知道如何写自己的!方法的版本。

我正在编写一个搜索两个字符之间的字符串的方法。我希望它将字符串修改为等于新字符串。

如何实现这一目标。 (我有找到新字符串的方法只需要知道如何修改调用者)

ANSWER

class String
  def find_between(marker_one , marker_two)
    self[/#{Regexp.escape(marker_one)}(.*?)# {Regexp.escape(marker_two)}/m, 1]
  end

  def find_between!(marker_one , marker_two)
    self.replace(find_between(marker_one, marker_two))
  end
end

最终,self.replace就是所需要的

2 个答案:

答案 0 :(得分:4)

就像普通方法一样:

def mathod_name!
  # whatever
end

但是,惯例是,只有当你的“普通”版本的方法具有相同的名称时才应该添加一个bang替代品,这个版本在某种程度上更加“危险”< / em>的

您可以使用String#[]=修改字符串。

答案 1 :(得分:3)

这篇文章仅供参考,我强烈建议不要将它用于实际项目,除非你100%确定它可能会导致什么。

如果您想修改String类以添加新实例方法,请使用此

class String
  def cut!(start_pos, end_pos)
    # your magic
    self.replace(YOUR_NEW_STRING)
  end
end

然后你就可以像这样打电话了

x = "aaaabbbb"
x.cut! 1,4
puts x
=> "aaaa"

修改全局对象被认为是一种不好的做法(又名&#34;猴子修补&#34;)。但如果有人需要使用它,那么至少要使用refinements。到目前为止,这是我唯一有效的用例。