我们最近决定在我的工作中制定一个红宝石风格指南。其中一条规定是每行不得超过80个字符。因为这是一个Rails项目,所以我们经常使用稍微长一点的字符串。“用户X想给你发送一条关于Y的消息”,这并不总是符合80个字符的风格限制。
我知道有三种方法可以让一个长字符串跨越多行:
HEREDOC
Q % {}
实际的字符串连接。
然而,所有这些情况最终都需要更多的计算周期,这看起来很愚蠢。显然是字符串连接,但对于HEREDOC和%Q,我必须去掉换行符,通过类似.gsub(/\n$/, ")的东西。
有没有一种纯语法的方法来做到这一点,这相当于把整个字符串放在一行上?显然,我们的目标是不花费任何额外的周期,只是因为我想让我的代码更具可读性。(是的,我知道你必须做出很多权衡……但对于字符串长度,这似乎很愚蠢。)
更新:
反斜杠不是我想要的,因为这样会失去缩进,这会影响样式/可读性。
例子:
if foo
string = "this is a \
string that spans lines"
end
我发现上面的内容读起来有点难。
编辑:我在下面添加了一个答案;三年后,我们现在有了弯弯曲曲的heredoc。
这是一个非常老的问题,但这个问题似乎仍然存在,这里有一个更新的答案。因为最初的海报表明这是一个Rails项目,你可以看看Rails的字符串屈折来寻求帮助。
my_long_string = <<-STRING
hello
there
multiline
multiindented string
STRING
=> " hello\n there\n multiline\n multiindented string\n"
进入压扁方法。
my_long_string = <<-STRING.squish
so
long
multiline
multiindented string
STRING
=> "so long multiline multiindented string"
根据文件-
压扁()
返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空格组更改为每个空格。
我有这个问题时,我试图写一个很长的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。
这里你有缩进的可读性,易于修改,没有繁琐的引号和反斜杠在每一行。连接字符串的成本应该可以忽略不计。
Squish in Rails正在做您需要做的事情。
https://apidock.com/rails/String/squish
结尾是这样的:
%{ Multi-line
string }.squish
因为你在Ruby中需要它,只需要看看Rails代码:
%{ Multi-line
string }
.gsub!(/[[:space:]]+/, " ")
.strip!