在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!