Ruby-way (TM) ตั้งแต่ Ruby 2.3: ในการกำหนดสตริงหลายบรรทัดพร้อมกับการขึ้นบรรทัดใหม่และการระบุที่เหมาะสมให้ใช้ 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 ไก่เขี่ยคำพูดและสตริงตัวอักษรร้อยละจะทำให้เกิด) แล้วเครื่องหมายทับขวาเป็นตัวละครที่ไม่ใช่ช่องว่างที่ผ่านมาจะดำเนินการต่อบรรทัดและจะทำให้ทับทิมเพื่อเชื่อมสตริงกลับ (ระวังช่องว่างเหล่านั้นภายในสตริงที่ยกมา):
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..."
รายละเอียดเพิ่มเติม:
Ruby HEREDOC ไวยากรณ์
นี่เอกสารสัญกรณ์สำหรับ Strings ทำงานเป็นวิธีการกำหนดบล็อคข้อความยาวแบบอินไลน์ในรหัส มันเริ่มต้น<<
แล้วตามด้วยสตริงที่ผู้ใช้กำหนด (End of String terminator) บรรทัดต่อไปนี้ทั้งหมดถูกต่อกันจนกว่าจะพบจุดสิ้นสุดของจุดสิ้นสุดที่จุดเริ่มต้นของบรรทัด:
puts <<HEREDOC
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"
สามารถเลือก End terminator ได้อย่างอิสระ แต่เป็นเรื่องปกติที่จะใช้ "EOS" (End of String) หรือสิ่งที่ตรงกับโดเมนของ String เช่น "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 สามารถทำสิ่งที่บ้าบางอย่างเช่นการดำเนินการคำสั่งโดยใช้ backticks:
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 หมายถึงการเรียงต่อกันเสมอหากพบสองสตริง (single และ double ที่ยกมา) ที่พบกลับไปด้านหลัง:
puts "select..." 'from table...' "where..."
# -> "select...from table...where..."
ข้อแม้คือสิ่งนี้ใช้ไม่ได้กับการแบ่งบรรทัดเนื่องจาก Ruby แปลความหมายของคำแถลงจุดสิ้นสุดและบรรทัดที่ตามมาของการใช้คำสั่งเพียงอย่างเดียวบนบรรทัดไม่ได้ทำอะไรเลย