Ruby 2.3'ten beri Ruby-way (TM): Satırsonu ve doğru iddaa içeren çok satırlı bir dize tanımlamak için kıvrımlı HEREDOC'u kullanın <<~
:
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..."
Doğru idrar endişe verici değilse, tek ve çift tırnaklar Ruby'de birden fazla satıra yayılabilir:
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..."
Tek veya çift tırnaklar hantalsa, bu çok fazla kaçış gerektirdiğinden, yüzde dize değişmez gösterim %
en esnek çözümdür:
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..."
Amaç satır satırlarından kaçınmaksa (hem kıvrımlı HEREDOC, tırnak işaretleri ve yüzde değişmez değeri neden olur), son boşluk olmayan karakter olarak bir ters eğik çizgi devam eder ve Ruby'nin Dizeleri arka arkaya birleştirmesine neden olur (alıntılanan dizenin içindeki boşluklara dikkat edin):
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 kullanırsanız String.squish
, ön ve arka boşluk dizesini sıyırır ve ardışık tüm boşluk alanlarını (yeni satırlar, sekmeler ve tümü) tek bir alana daraltır:
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..."
Daha fazla detay:
Ruby HEREDOC Sözdizimi
Burada Dizeler için Belge Gösterimi çalışır kodda metin satır içi uzun bloklar atamak için bir yoldur. Ardından <<
kullanıcı tanımlı bir Dize (Dize Sonu sonlandırıcısı) başlar. Aşağıdaki tüm satırlar, bir satırın en başında Dize Sonu sonlandırıcı bulunana kadar birleştirilir :
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
Dize Sonu sonlandırıcı serbestçe seçilebilir, ancak "EOS" (Dize Sonu) gibi veya Dize'nin "SQL" gibi alanıyla eşleşen bir şey kullanmak yaygındır.
HEREDOC, enterpolasyonu varsayılan olarak veya EOS sonlandırıcının çift tırnak işaretli olduğu durumlarda destekler :
price = 10
print <<"EOS" # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."
EOS sonlandırıcı tek tırnaklıysa enterpolasyon devre dışı bırakılabilir:
print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."
Bunun önemli bir kısıtlaması <<HEREDOC
Dize Sonu sonlandırıcısının satırın başında olması gerektiğidir:
puts <<EOS
def foo
print "foo"
end
EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS
Bu <<-
sorunu çözmek için sözdizimi oluşturuldu. EOS sonlandırıcının kodun daha güzel görünmesi için girintili olmasına izin verir. <<-
Ve EOS sonlandırıcı arasındaki çizgiler, tüm girintiler dahil olmak üzere hala tam olarak kullanılmaktadır:
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'ten bu yana, kıvrımlı HEREDOC <<~
önde gelen boşluğu kaldırıyor:
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"
Yalnızca sekme ve boşluk içeren boş satırlar ve satırlar << ~ tarafından yoksayılır
puts <<~EOS.inspect
Hello
World!
EOS
#-> "Hello\n..World!"
Hem sekmeler hem de boşluklar kullanılıyorsa, sekmeler 8 boşluğa eşit kabul edilir. En az girintili çizgi bir sekmenin ortasındaysa, bu sekme kaldırılmaz.
puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"
HEREDOC, backticks kullanarak komutları yürütmek gibi çılgın şeyler yapabilir:
puts <<`EOC`
echo #{price}
echo #{price * 2}
EOC
HEREDOC Dize tanımları "yığınlanabilir", yani ilk EOS sonlandırıcının (aşağıda EOSFOO) ilk dizeyi bitirip ikinciyi başlatacağı (aşağıdaki EOSBAR):
print <<EOSFOO, <<EOSBAR # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR
Ben hiç kimse böyle kullanmak olacağını sanmıyorum, ama <<EOS
gerçekten sadece bir dize değişmez ve bir dize normalde konabilir her yere konabilir:
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, ancak Rails >=
3.0'a sahip değilseniz String.strip_heredoc
, aynı olanı kullanabilirsiniz .<<~
# 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
Yüzde Dizgi Değişmezleri
Bkz RubyDoc böyle bir şekilde bir parantez çifti bir dize izledi yüzde işaretini nasıl kullanılacağı için %(...)
, %[...]
,%{...}
vs ya da bunların herhangi bir alfanümerik olmayan karakterin bir çift gibi%+...+
Son sözler
Son olarak, asıl sorunun cevabını almak için "Birleştirme anlamına gelmenin bir yolu var mı?" Cevap: İki dizginin (tek ve çift tırnaklı) arka arkaya bulunması durumunda Ruby her zaman birleştirme anlamına gelir:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
Uyarı, bunun satır kesmeleri arasında çalışmadığıdır, çünkü Ruby bir ifade sonu yorumlamaktadır ve sadece bir satırdaki sadece dizelerin sonuç satırı hiçbir şey yapmaz.