Ruby自定义字符串方法?

时间:2014-03-15 17:39:01

标签: ruby string

如何让这段代码更优雅?我有:

alpha = "lorem ipsum"
alpha = alpha + "\n" + "more text"
alpha = alpha + "\n" + "look I'm woody, howdy howdy howdy"
#etc

我想:

alpha.puts "lorem ipsum"
alpha.puts "more text"
alpha.puts "look I'm woody, howdy howdy howdy"
# etc

或者,也许alpha.append因为没有采取。我试过了:

class String
  def append(apnd)
    self.to_s + "\n" + apnd
  end
end

但不修改它,只返回它。我从搜索中学到了你不能修改自我。我遇到同样的问题:

def apnd(a,b)
  a = a + "\n" + b
end

我觉得很困惑,因为我认为Ruby通过引用而不是按值传递对象。

我看到了“Custom + Method in Ruby String”以及其他一些Stack Overflow帖子。


更新

啊哈,对于apnd方法,我可以关注“'pass parameter by reference' in Ruby?”,但这意味着我不能拥有apnd(alpha, "stuff"),它必须是apnd(:alpha, "stuff", binding)减少重复,因为我必须将绑定传递给每个方法。

3 个答案:

答案 0 :(得分:4)

您可以使用StringIO

接近您描述的内容
require 'stringio'
alpha_io = StringIO.new

alpha_io.puts "lorem ipsum"
alpha_io.puts "more text"
alpha_io.puts "look I'm woody, howdy howdy howdy"

alpha_io.string
# => "lorem ipsum\nmore text\nlook I'm woody, howdy howdy howdy\n"

但是,如果你的字符串主要是字面意思,你可以通过使用heredoc轻松逃脱:

alpha = <<-STRING
lorem ipsum
more text
look I'm woody, howdy howdy howdy
Some interpolation #{"here".upcase}
STRING

puts alpha
# lorem ipsum
# more text
# look I'm woody, howdy howdy howdy
# Some interpolation HERE

(即使SO与语法混淆,我向你保证它是有效的红宝石;)

答案 1 :(得分:1)

class String
  def append(apnd)
    concat("\n#{apnd}")
  end
end

但我认为这是正确的做法。我觉得这种方法有代码味道。如果您在添加其他行时确定换行符,那么即使没有添加其他行,您也应该关心它。在您的情况下,endline字符应附加到前一个字符串,而不是添加到要添加的字符串。从一开始,你应该保持你的字符串规范化,因为它们以一个结束字符结束。为此,我的个人库中有一个名为String#unchompString#unchomp!的方法:

class String
  def unchomp; sub(/#$/?\z/, $/) end
  def unchomp!; sub!(/#$/?\z/, $/) end
end

每当我需要确保字符串以endline字符结尾时,我将此方法应用于它。

答案 2 :(得分:1)

alpha = "lorem ipsum"
alpha = alpha + "\n" + "more text"
alpha = alpha + "\n" + "look I'm woody, howdy howdy howdy"
     

我想:

alpha.puts "lorem ipsum"
alpha.puts "more text"
alpha.puts "look I'm woody, howdy howdy howdy"

我反驳说你走错了路;这不是连接到字符串,而是真正寻找类似于数组的行为,您可以在其中将内容推送到其中,然后在此时输出它。

例如:

alpha = ["lorem ipsum"]
alpha << "more text"
alpha << "look I'm woody, howdy howdy howdy"

puts alpha
# >> lorem ipsum
# >> more text
# >> look I'm woody, howdy howdy howdy

或者:

alpha.join("\n")
# => "lorem ipsum\nmore text\nlook I'm woody, howdy howdy howdy"

如果您使用字符串作为缓冲区,那么您将自己画成角落,特别是如果您需要稍后在我们的代码中修改该缓冲区。将其保留为数组可让您轻松push / pullshift / unshiftinsert / deletesort然后,当一切都按照你的意愿时,只需输出它。