在Ruby中拆分多行上的长字符串,而不剥离换行符

我们最近决定在我的工作中制定一个红宝石风格指南。其中一条规定是每行不得超过80个字符。因为这是一个Rails项目,所以我们经常使用稍微长一点的字符串。"用户X想给你发一条关于Y的消息"并不总是符合80个字符的样式限制。

我知道有三种方法可以让一个长字符串跨越多行:

  • HEREDOC
  • Q % {}
  • 实际的字符串连接。

然而,所有这些情况最终都需要更多的计算周期,这看起来很愚蠢。显然是字符串连接,但对于HEREDOC%Q,我必须去掉换行符,通过类似.gsub(/\n$/, '')的东西。

有没有一种纯语法的方法来做到这一点,这相当于把整个字符串放在一行上?显然,我们的目标是不花费任何额外的周期,只是因为我想让我的代码更具可读性。(是的,我知道你必须做出很多权衡……但对于字符串长度,这似乎很愚蠢。)

< p >更新: 反斜杠不是我想要的,因为你会失去缩进,这真的会影响样式/可读性

例子:

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

我发现上面的内容读起来有点难。

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

158018 次浏览

你可以使用\来指示Ruby的任何一行继续下一行。这也适用于字符串:

string = "this is a \
string that spans lines"


puts string.inspect

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

也许这就是你要找的?

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


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

三年过去了,现在Ruby 2.3有了一个解决方案:弯弯曲曲的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=ABABABABABABABABA
%2Fus-east-1%2Fs3%2Faws4_request&
X-Amz-Date=20170702T000940Z&
X-Amz-Expires=3600&X-Amz-SignedHeaders=host&
X-Amz-Signature=ABABABABABABABABABABAB
ABABABABABABABABABABABABABABABABABABA
).join

注意,当url字符串形成时,不能有任何换行符和空格。如果需要换行,那么使用HEREDOC。

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

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

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

其中name = 'fred' this生成It's a nice day "fred" for a walk!

你可以将多个字符串拼接成几行:

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

这是一个非常老的问题,但这个问题似乎仍然存在,这里有一个更新的答案。因为最初的海报表明这是一个Rails项目,你可以看看Rails的字符串屈折来寻求帮助。

my_long_string = <<-STRING
hello
there
multiline
multiindented string
STRING


=> " hello\n    there\n multiline\n      multiindented string\n"

进入squish方法。

my_long_string = <<-STRING.squish
so
long
multiline
multiindented string
STRING


=> "so long multiline multiindented string"

根据文件-

< p > squish() 返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空格组分别更改为一个空格

Squish in Rails正在做您需要做的事情。

https://apidock.com/rails/String/squish

结尾是这样的:

%{ Multi-line
string }.squish

因为你在Ruby中需要它,只需要看看Rails代码:

%{ Multi-line
string }
.gsub!(/[[:space:]]+/, " ")
.strip!