如何让这段代码更优雅?我有:
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)
减少重复,因为我必须将绑定传递给每个方法。
答案 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#unchomp
和String#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
/ pull
,shift
/ unshift
,insert
/ delete
或sort
然后,当一切都按照你的意愿时,只需输出它。