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

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

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

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

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

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

例子:

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

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

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


当前回答

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

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

puts string.inspect

将输出"这是一个跨行的字符串"

其他回答

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

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

where name = 'fred'这就产生了“fred”散步的好天气!

我有这个问题时,我试图写一个很长的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。

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

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

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

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

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

puts string.inspect

将输出"这是一个跨行的字符串"

也许这就是你要找的?

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

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