在Ruby中多行分解长string而不剥离换行符

我们最近决定在我的工作,ruby风格指南。 其中一条规定是不得超过80个字符。 由于这是一个Rails项目,所以我们经常会有更长一些的string – 例如“用户X想给您发送一条关于Thing Y的消息”,这个消息并不总是符合80个字符的限制。

我知道有三种方法可以有一个很长的string跨越多行:

  • HEREDOC
  • %Q {}
  • 实际的string连接。

但是,所有这些情况最终都会花费更多的计算周期,这似乎很愚蠢。 显然是string连接,但是对于HEREDOC和%QI,必须通过像.gsub(/ \ n $ /,'')之类的方法去掉换行符。

有没有一个纯粹的语法方式来做到这一点,这相当于只有一行上的整个string? 显然,我们的目标是不花费任何额外的周期,因为我希望我的代码更具可读性。 (是的,我意识到你必须做很多的交易…但是对于string的长度来说,这看起来很愚蠢。)

更新:反斜杠不完全是我想要的,因为你失去了缩进,这真的影响风格/可读性。

例:

if foo string = "this is a \ string that spans lines" end 

我觉得上面有点难以阅读。

编辑 :我在下面添加了一个答案; 三年后,我们现在有了波折的heredoc。

也许这是你在找什么?

 string = "line #1"\ "line #2"\ "line #3" p string # => "line #1line #2line #3" 

您可以使用\来指示任何一行Ruby继续下一行。 这也适用于string:

 string = "this is a \ string that spans lines" puts string.inspect 

会输出"this is a string that spans lines"

三年后,Ruby 2.3中现在有了一个解决scheme:这个波浪起伏的heredoc。

 class Subscription def warning_message <<~HEREDOC Subscription expiring soon! Your free trial will expire in #{days_until_expiration} days. Please update your billing information. HEREDOC end end 

博客文章链接: https : //infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

最小缩进行的缩进将从内容的每一行中删除。

当我尝试写一个很长的URL时,我遇到了这个问题,下面的工作。

 image_url = %w( http://minio.127.0.0.1.xip.io:9000/ bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/ 28ed3774-b234-4de2-9a11-7d657707f79c? X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Credential=AJAKJFAFGAKAJDDAF %2Fus-east-1%2Fs3%2Faws4_request& X-Amz-Date=20170702T000940Z& X-Amz-Expires=3600&X-Amz-SignedHeaders=host& X-Amz-Signature=QEWKJRQJEWR813247812347FKFS KQWREJQ3108418324732o45o1324kldsfjasf ).join 

请注意,urlstring形成时不能有任何换行符,空格。 如果你想换行,那么使用HEREDOC。

在这里,你有可读性的缩进,易于修改,没有繁琐的引号和反斜线在每一行。 joinstring的成本应该可以忽略不计。

我修改了Zack的答案,因为我想要空格和插值而不是换行符,并使用:

 %W[ It's a nice day "#{name}" for a walk! ].join(' ') 

这里的name = 'fred'产生It's a nice day "fred" for a walk!