chu*_*g2k 211 ruby ruby-on-rails
我们最近在工作中决定采用红宝石风格指南.其中一条规则是任何行都不应超过80个字符.由于这是一个Rails项目,我们经常会有一些更长的字符串 - 即" 用户X想要向您发送有关Thing Y的消息 ",这并不总是符合80个字符的样式限制.
我知道有三种方法可以让长字符串跨越多行:
然而,所有这些情况最终都需要更多的计算周期,这看起来很愚蠢.字符串连接显然,但是HEREDOC
,%Q
我必须通过类似的方式删除换行符.gsub(/\n$/, '')
.
有没有纯语法方法来做到这一点,这相当于只需要将整个字符串放在一行上?显然,目标是不要花费任何额外的周期,因为我希望我的代码更具可读性.(是的,我意识到你必须做出很多权衡......但是对于字符串长度来说,这看起来很愚蠢.)
更新:反斜杠不是我想要的,因为你会丢失缩进,这实际上会影响样式/可读性.
例:
if foo
string = "this is a \
string that spans lines"
end
Run Code Online (Sandbox Code Playgroud)
我发现上面有点难以阅读.
编辑:我在下面添加了一个答案; 三年后,我们现在有了波浪形的heredoc.
Jes*_*ehz 407
也许这就是你要找的东西?
string = "line #1"\
"line #2"\
"line #3"
p string # => "line #1line #2line #3"
Run Code Online (Sandbox Code Playgroud)
Emi*_*ily 52
您可以使用它\
来指示任何Ruby行继续在下一行.这也适用于字符串:
string = "this is a \
string that spans lines"
puts string.inspect
Run Code Online (Sandbox Code Playgroud)
将输出 "this is a string that spans lines"
chu*_*g2k 37
三年后,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
Run Code Online (Sandbox Code Playgroud)
博客文章链接:https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
最小缩进行的缩进将从内容的每一行中删除.
小智 26
这是一个非常老的问题,但由于这个问题似乎仍然出现,这里有一个更新的答案。由于原始海报表明这是针对 Rails 项目的,因此您可以向 Rails 的字符串变形寻求帮助。
my_long_string = <<-STRING
hello
there
multiline
multiindented string
STRING
=> " hello\n there\n multiline\n multiindented string\n"
Run Code Online (Sandbox Code Playgroud)
输入squish
方法。
my_long_string = <<-STRING.squish
so
long
multiline
multiindented string
STRING
=> "so long multiline multiindented string"
Run Code Online (Sandbox Code Playgroud)
根据文档 -
squish()
返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空格组各改为一个空格。
Zac*_* Xu 17
当我尝试写一个很长的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
Run Code Online (Sandbox Code Playgroud)
注意,在形成url字符串时,一定不能有任何换行符,空格.如果您想要换行,请使用HEREDOC.
在这里你有缩进的可读性,易于修改,没有每行的繁琐的引号和反斜杠.加入琴弦的成本应该可以忽略不计.
我修改了Zack的答案,因为我想要空格和插值而不是新行并使用:
%W[
It's a nice day "#{name}"
for a walk!
].join(' ')
Run Code Online (Sandbox Code Playgroud)
其中,name = 'fred'
这将产生It's a nice day "fred" for a walk!