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

4smxwvx5  于 2023-11-18  发布在  Ruby
关注(0)|答案(9)|浏览(164)

我们最近在工作中决定做一个ruby风格的指南。其中一条法令是行的宽度不应该超过80个字符。因为这是一个Rails项目,我们经常会有稍微长一点的字符串-例如“User X wanted to send you a message about Thing Y”,它并不总是符合80个字符的风格限制。
我知道有三种方法可以让一个长字符串跨越多行:

  • HEREDOC
  • %Q{}
  • 实际字符串串联。

然而,所有这些情况最终都需要更多的计算周期,这看起来很愚蠢。字符串连接很明显,但是对于HEREDOC%Q,我必须通过类似.gsub(/\n$/, '')的东西去掉换行符。
有没有一种纯语法的方法来做到这一点,它相当于把整个字符串放在一行上?很明显,目标是不花费任何额外的周期,只是因为我希望我的代码更具可读性。(是的,我意识到你必须做出很多权衡.但对于字符串长度,这似乎很愚蠢。)
更新:反斜杠并不是我想要的,因为你失去了缩进,这真的会影响风格/可读性。
示例如下:

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

字符串
我觉得上面的内容有点难以阅读。

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

ukqbszuj

ukqbszuj1#

或许这就是你要找的?

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

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

字符串

93ze6v8z

93ze6v8z2#

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

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

puts string.inspect

字符串
将输出"this is a string that spans lines"

clj7thdc

clj7thdc3#

三年后,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
缩进最少的行的缩进将从内容的每一行中删除。

oewdyzsn

oewdyzsn4#

这是一个很老的问题了,但是现在这个问题似乎仍然会出现,这里有一个更新的答案。因为最初的海报表明这是一个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"


根据文件-
squish()返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空格组更改为每个空格。

wnrlj8wa

wnrlj8wa5#

当我尝试写一个很长的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。
为了可读性和便于修改,这里使用了缩进,每行都没有繁琐的引号和反斜杠。连接字符串的成本应该可以忽略不计。

cyvaqqii

cyvaqqii6#

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

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

字符串
其中name = 'fred'这产生It's a nice day "fred" for a walk!

7fhtutme

7fhtutme7#

Rails中的Squish正在做你需要的事情。
https://apidock.com/rails/String/squish
结束它看起来像这样:

%{ Multi-line
   string }.squish

字符串
因为你在Ruby中需要它,所以看看Rails代码:

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

vmdwslir

vmdwslir8#

您可以连接拆分在多行中的多个字符串:

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

字符串

fjnneemd

fjnneemd9#

如果你想使用反斜杠,并希望将字符串括起来,只需将它们括在引号中:

str = "This is a multi" \
      "line string!"
puts str

字符串
这是一个多行字符串!

相关问题