Answers:
这个答案有很多片段可以帮助我获得所需的信息(轻松的多行连接,而无需多余的空格),但是由于没有实际的答案,因此我在这里进行了编译:
str = 'this is a multi-line string'\
' using implicit concatenation'\
' to prevent spare \n\'s'
=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"
另外,这是一个使用有趣的HEREDOC语法的版本(通过此链接):
p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM users
ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"
后者主要用于需要更大处理灵活性的情况。我个人不喜欢它,它把处理放在字符串的一个奇怪的地方(即,在字符串的前面,但是使用通常在后面的实例方法),但是它就在那里。请注意,如果要缩进最后一个END_SQL
标识符(这很常见,因为它可能在函数或模块内部),则需要使用带连字符的语法(即,p <<-END_SQL
代替p <<END_SQL
)。否则,缩进空格会使标识符被解释为字符串的延续。
对于我来说,这并不会节省太多的键入操作,但它看起来比使用+号更好。
另外(几年后,我在一次编辑中说),如果您使用的是Ruby 2.3+,则运算符<<〜也可用,该运算符从最终字符串中删除了多余的缩进。.gsub
在这种情况下,您应该能够删除该调用(尽管它可能取决于起始缩进和最终需求)。
编辑:再添加一个:
p %{
SELECT * FROM users
ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"
p <<END_SQL
应该p <<-END_SQL
是答案。(可选)您可以使用弯曲的HEREDOC运算符删除领先的空格,<<~END_SQL
<<~
到答案将是很好,最终从那里进行了研究。就个人而言,我使用<<~MSG.strip ... MSG
它也剥离了最后一个\n
。
在ruby 2.0中,您现在可以使用 %
例如:
SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}
squish
,则在输出上调用会有所帮助。
是的,如果您不介意插入额外的换行符:
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc'
另外,您可以使用heredoc:
conn.exec <<-eos
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos
%Q(...)
%(...)
您已经阅读了多行字符串的多种语法。我最喜欢的是Perl风格的:
conn.exec %q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc}
多行字符串以%q开头,后跟{,[或(,然后以相应的反向字符结束。
conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from #{table_names},
where etc etc etc etc etc etc etc etc etc etc etc etc etc}
我实际上不知道如何调用这些类型的多行字符串,因此我们仅将它们称为Perl多行。
但是请注意,无论您使用Perl多行还是Mark和Peter所建议的heredocs,最终都可能会出现不必要的空格。在我的示例及其示例中,“ from”和“ where”行均因其在代码中的缩进而包含前导空格。如果不需要此空格,则必须像现在这样使用串联字符串。
%q
系列产生的字符串将包含换行符,这与原始代码不相等。
有时值得删除换行符,\n
例如:
conn.exec <<-eos.squish
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos
您也可以使用双引号
x = """
this is
a multiline
string
"""
2.3.3 :012 > x
=> "\nthis is\na multiline\nstring\n"
如果需要删除换行符“ \ n”,请在每行末尾使用反斜杠“ \”
"" + "double quotes with some content" + ""
。
"x"
看上去比"""x"""
(基本上相同""+"x"+""
)或"""""x"""""
(与相同)更好并且工作更快"" + "" + "x" + "" + ""
。使用Ruby,而不是Python,"""
而不是"
在需要多行字符串时使用。
其他选项:
#multi line string
multiline_string = <<EOM
This is a very long string
that contains interpolation
like #{4 + 5} \n\n
EOM
puts multiline_string
#another option for multiline string
message = <<-EOF
asdfasdfsador #{2+2} this month.
asdfadsfasdfadsfad.
EOF
puts message
<<EOM
为<<-EOM
,否?
<<-EOF
例子有用。我的猜测是任何一种方法都可以。
最近,有了Ruby 2.3的新功能,新功能squiggly HEREDOC
将使您以最少的变化就能以一种不错的方式编写多行字符串,因此结合使用.squish
(如果您使用的是rails)将使您以一种不错的方式编写多行!在仅仅使用红宝石的情况下,你可以做一个<<~SQL.split.join(" ")
是几乎相同
[1] pry(main)> <<~SQL.squish
[1] pry(main)* select attr1, attr2, attr3, attr4, attr5, attr6, attr7
[1] pry(main)* from table1, table2, table3, etc, etc, etc, etc, etc,
[1] pry(main)* where etc etc etc etc etc etc etc etc etc etc etc etc etc
[1] pry(main)* SQL
=> "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 from table1, table2, table3, etc, etc, etc, etc, etc, where etc etc etc etc etc etc etc etc etc etc etc etc etc"
参考:https : //infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' <<
'from table1, table2, table3, etc, etc, etc, etc, etc, ' <<
'where etc etc etc etc etc etc etc etc etc etc etc etc etc'
<<是字符串的串联运算符
+
是常规串联运算符,<<
是就地附加运算符。在文字上使用副作用碰巧在这里起作用(第一个字符串被修改了两次并返回),但是恕我直言,这很奇怪,让我做了两次尝试,+
这很清楚。但也许我只是Ruby的新手...
frozen_string_literal
启用,则将无法使用
如果您确实介意多余的空格和换行符,则可以使用
conn.exec %w{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc} * ' '
(将%W用于插值字符串)
conn.exec [
"select attr1, attr2, attr3, ...",
"from table1, table2, table3, ...",
"where ..."
].join(' ')
此建议相对于此处文档和长字符串具有优势,即自动缩进可以适当缩进字符串的每个部分。但这是以效率为代价的。
从Ruby 2.3开始的Ruby-way(TM):要使用多行和正确的标识来定义多行字符串,请使用波浪 形的HEREDOC <<~
:
conn.exec <<~EOS
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc
where etc etc etc etc etc etc etc etc etc etc etc etc etc
EOS
# -> "select...\nfrom...\nwhere..."
如果不考虑正确的标识,那么在Ruby中单引号和双引号可以跨越多行:
conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc"
# -> "select...\n from...\n where..."
如果单引号或双引号很麻烦,因为这需要大量的转义,那么百分比字符串文字表示法%
是最灵活的解决方案:
conn.exec %(select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc
where (ProductLine = 'R' OR ProductLine = "S") AND Country = "...")
# -> "select...\n from...\n where..."
如果目的是避免换行(弯曲的HEREDOC,引号和百分比字符串文字都将导致换行),则作为最后一个非空白字符的反斜杠将继续该行,并将导致Ruby将字符串串连起来(当心带引号的字符串中的空格):
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' \
'from table1, table2, table3, etc, etc, etc, etc, etc, ' \
'where etc etc etc etc etc etc etc etc etc etc etc etc etc'
# -> "select...from...where..."
如果您使用Rails,String.squish
则会删除前导和尾随字符串,并将所有连续的空格(换行符,制表符和所有空格)折叠为一个空格:
conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc".squish
# -> "select...from...where..."
更多细节:
字符串的此处文档表示法是一种在代码中内联指定长文本块的方法。它<<
由一个用户定义的字符串(字符串终止符)开头。连接以下所有行,直到在行的开头找到“字符串结尾”终止符为止:
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
字符串结尾终止符可以自由选择,但是通常使用“ EOS”(字符串结尾)之类的东西或与字符串的域匹配的东西(例如“ SQL”)。
HEREDOC 默认情况下或在EOS终止符用双引号引起来时支持插值:
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
如果EOS终止符是单引号,则可以禁用插值:
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
对的一个重要限制<<HEREDOC
是,字符串结束符必须位于行首:
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
为了解决这个问题,<<-
创建了语法。它允许缩进EOS终止符以使代码看起来更好。<<-
和EOS终止符之间的行仍然完整使用,包括所有缩进:
puts <<-EOS # Use <<- to indent End of String terminator
def foo
print "foo"
end
EOS
# -> "..def foo\n....print "foo"\n..end"
从Ruby 2.3开始,我们现在已经混乱地<<~
将HEREDOC 删除了领先的空白:
puts <<~EOS # Use the squiggly HEREDOC <<~ to remove leading whitespace (since Ruby 2.3!)
def foo
print "foo"
end
EOS
# -> "def foo\n..print "foo"\nend"
空行和仅包含制表符和空格的行将被<<〜忽略
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
如果同时使用制表符和空格,则制表符被视为等于8个空格。如果最小缩进线在选项卡的中间,则不会删除该选项卡。
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
HEREDOC可以做一些疯狂的事情,例如使用反引号执行命令:
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
HEREDOC字符串定义可以“堆叠”,这意味着第一个EOS终止符(下面的EOSFOO)将结束第一个字符串并开始第二个字符串(下面的EOSBAR):
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
我认为没有人会这样使用它,但<<EOS
实际上它只是一个字符串文字,可以放在通常可以放置字符串的任何地方:
def func(a,b,c)
puts a
puts b
puts c
end
func(<<THIS, 23, <<THAT)
Here's a line
or two.
THIS
and here's another.
THAT
如果您没有Ruby 2.3,但没有Rails >=
3.0,则可以使用String.strip_heredoc
与<<~
# File activesupport/lib/active_support/core_ext/string/strip.rb, line 22
class String
def strip_heredoc
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
end
end
puts <<-USAGE.strip_heredoc # If no Ruby 2.3, but Rails >= 3.0
This command does such and such.
Supported options are:
-h This message
...
USAGE
见RubyDoc如何使用百分号然后在括号中的字符串进行配对,诸如%(...)
,%[...]
,%{...}
等,或一对任何非字母数字字符的诸如%+...+
最后,要获得对原始问题“是否有隐含串联的方法?”的答案。回答:如果找到两个背对背的字符串(单引号和双引号),Ruby总是暗示连接:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
需要注意的是,这在跨行中断中不起作用,因为Ruby正在解释语句的结尾,并且仅一行上的仅字符串的相应行没有任何作用。
<<~TEXT
Hi #{user.name},
Thanks for raising the flag, we're always happy to help you.
Your issue will be resolved within 2 hours.
Please be patient!
Thanks again,
Team #{user.organization.name}
TEXT
<<-TEXT
和之间存在差异<<~TEXT
,前者保留了块内的间距,而后者则没有。
还有其他选择。像串联等,但是从总体上讲,这更有意义。
如果我错了,请告诉我如何...
和您一样,我也在寻找不包含换行符的解决方案。(尽管它们在SQL中可能是安全的,但就我而言,它们并不安全,并且我要处理大量文本)
可以说这很丑陋,但是您可以在Heredoc中反斜杠转义换行以从结果字符串中省略它们:
conn.exec <<~END_OF_INPUT
select attr1, attr2, attr3, attr4, attr5, attr6, attr7 \
from table1, table2, table3, etc, etc, etc, etc, etc, \
where etc etc etc etc etc etc etc etc etc etc etc etc etc
END_OF_INPUT
请注意,如果没有插值(IE <<~'END_OF_INPUT'
),您将无法做到这一点,因此请小心。#{expressions}
将在此处进行评估,而不会在您的原始代码中进行评估。因此,威尔逊的答案可能会更好。