Apakah ada cara untuk membuat ini terlihat sedikit lebih baik?
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'
Seperti, apakah ada cara untuk menyiratkan penggabungan?
ruby
code-formatting
Zombie
sumber
sumber
Jawaban:
Ada beberapa bagian dari jawaban ini yang membantu saya mendapatkan apa yang saya butuhkan (penggabungan multi-baris mudah TANPA spasi kosong tambahan), tetapi karena tidak ada jawaban aktual yang memilikinya, saya menyusunnya di sini:
Sebagai bonus, inilah versi menggunakan sintaks HEREDOC yang lucu (melalui tautan ini ):
Yang terakhir sebagian besar akan untuk situasi yang membutuhkan lebih banyak fleksibilitas dalam pemrosesan. Saya pribadi tidak suka, itu menempatkan pemrosesan di tempat yang aneh wrt string (yaitu, di depannya, tetapi menggunakan metode contoh yang biasanya datang sesudahnya), tetapi ada di sana. Perhatikan bahwa jika Anda membuat indentasi
END_SQL
pengidentifikasi terakhir (yang umum, karena ini mungkin di dalam suatu fungsi atau modul), Anda harus menggunakan sintaks hyphenated (yaitu,p <<-END_SQL
bukannyap <<END_SQL
). Jika tidak, spasi indentasi menyebabkan pengidentifikasi ditafsirkan sebagai kelanjutan dari string.Ini tidak menghemat banyak pengetikan, tetapi terlihat lebih bagus daripada menggunakan tanda +, bagi saya.
Juga (saya katakan dalam edit, beberapa tahun kemudian), jika Anda menggunakan Ruby 2.3+, operator << ~ juga tersedia , yang menghilangkan lekukan ekstra dari string terakhir. Anda harus dapat menghapus
.gsub
doa, dalam hal itu (meskipun mungkin tergantung pada lekukan awal dan kebutuhan akhir Anda).EDIT: Menambahkan satu lagi:
sumber
p <<END_SQL
Seharusnya kalaup <<-END_SQL
tidak, ini adalah jawabannya. opsional, Anda dapat menghapus spasi terkemuka dengan operator HEREDOC berlekuk,<<~END_SQL
<<~
jawaban akan menyenangkan, akhirnya meneliti itu dari sana. Secara pribadi, saya menggunakan<<~MSG.strip ... MSG
yang juga strip yang terakhir\n
.Di ruby 2.0 sekarang Anda bisa menggunakannya
%
Sebagai contoh:
sumber
squish
pada output harus membantu.Ya, jika Anda tidak keberatan baris baru yang dimasukkan:
Atau Anda dapat menggunakan heredoc :
sumber
%Q(...)
%(...)
Ada beberapa sintaks untuk string multi-line seperti yang sudah Anda baca. Favorit saya adalah Perl-style:
String multi-baris dimulai dengan% q, diikuti oleh {, [atau (, dan kemudian diakhiri oleh karakter terbalik yang sesuai.% Q tidak memungkinkan interpolasi;% Q melakukannya Anda dapat menulis hal-hal seperti ini:
Saya sebenarnya tidak tahu bagaimana string multi-line ini disebut jadi mari kita sebut mereka Perl multilines.
Namun perhatikan bahwa apakah Anda menggunakan Perl multilines atau heredocs seperti yang disarankan Mark dan Peter, Anda akan berakhir dengan spasi putih yang mungkin tidak perlu. Baik dalam contoh saya dan contoh mereka, baris "dari" dan "di mana" berisi spasi putih terdepan karena lekukan mereka dalam kode. Jika spasi putih ini tidak diinginkan maka Anda harus menggunakan string gabungan seperti yang Anda lakukan sekarang.
sumber
%q
keluarga akan mencakup baris baru yang tidak sepadan dengan kode asli.Terkadang layak untuk menghapus karakter baris baru
\n
seperti:sumber
Anda juga dapat menggunakan tanda kutip ganda
Jika diperlukan untuk menghapus jeda baris "\ n" gunakan backslash "\" di akhir setiap baris
sumber
"" + "double quotes with some content" + ""
."x"
terlihat lebih baik dan bekerja lebih cepat daripada"""x"""
(yang pada dasarnya sama dengan""+"x"+""
) atau"""""x"""""
(yang sama dengan"" + "" + "x" + "" + ""
). Ini Ruby, bukan Python, tempat Anda menggunakan"""
alih-alih"
saat Anda membutuhkan string multi-baris.sumber
Pilihan lain:
sumber
<<EOM
menjadi<<-EOM
, bukan?<<-EOF
contoh saya . Dugaan saya adalah bahwa kedua cara bekerja.Baru-baru ini dengan fitur-fitur baru di Ruby 2.3 yang baru
squiggly HEREDOC
akan memungkinkan Anda menulis string multiline kami dengan cara yang baik dengan perubahan minimal sehingga menggunakan ini dikombinasikan dengan.squish
(jika Anda menggunakan rel) akan memungkinkan Anda menulis multiline dengan cara yang bagus! dalam hal hanya menggunakan ruby, Anda dapat melakukan<<~SQL.split.join(" ")
yang hampir samaref: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
sumber
<< adalah operator gabungan untuk string
sumber
+
adalah operator gabungan reguler,<<
adalah operator append tempat . Menggunakan efek samping pada literal kebetulan bekerja di sini (string pertama dimodifikasi dua kali dan kembali) tapi IMHO itu aneh dan membuat saya melakukan pengambilan ganda, di mana+
akan sangat jelas. Tapi mungkin aku baru di Ruby ...frozen_string_literal
diaktifkanJika Anda melakukan pikiran spasi dan baris ekstra, Anda dapat menggunakan
(gunakan% W untuk string interpolasi)
sumber
Untuk menghindari penutupan tanda kurung untuk setiap baris Anda cukup menggunakan tanda kutip ganda dengan garis miring terbalik untuk keluar dari baris baru:
sumber
Saran ini memiliki keunggulan dibandingkan dokumen-dokumen di sini dan string panjang yang dapat di-indentasi secara otomatis ke setiap bagian dari string dengan tepat. Tetapi itu datang dengan biaya efisiensi.
sumber
Ruby-way (TM) sejak Ruby 2.3: Gunakan HEREDOC berlekuk - lekuk
<<~
untuk mendefinisikan string multi-line dengan baris baru dan lekukan yang tepat:Jika indentasi yang tepat bukan masalah, maka kutipan tunggal dan ganda dapat menjangkau beberapa baris di Ruby:
Jika tanda kutip tunggal atau ganda rumit karena itu akan membutuhkan banyak pelarian, maka persen notasi string literal
%
adalah solusi yang paling fleksibel:Jika tujuannya adalah untuk menghindari baris baru (yang menyebabkan HEREDOC berlekuk-lekuk, kutipan dan persen string literal akan menyebabkan), maka kelanjutan garis dapat digunakan dengan menempatkan backslash
\
sebagai karakter non-spasi putih terakhir dalam satu baris. Ini akan melanjutkan baris dan akan menyebabkan Ruby menyatukan Strings back to back (perhatikan ruang-ruang di dalam string yang dikutip):Jika Anda menggunakan Rails
String.squish
akan menghapus string ruang memimpin dan mengekor dan menciutkan semua spasi putih berurutan (baris baru, tab, dan semua) menjadi satu ruang:Keterangan lebih lanjut:
Sintaks Ruby HEREDOC
Notasi Dokumen Di Sini untuk karya Strings adalah cara untuk menunjuk blok panjang inline teks dalam kode. Ini dimulai dengan
<<
diikuti oleh String yang ditentukan pengguna (ujung terminator String). Semua baris berikut digabungkan sampai akhir Terminator String ditemukan di awal baris:Terminator End of String dapat dipilih secara bebas, tetapi biasanya menggunakan sesuatu seperti "EOS" (End of String) atau sesuatu yang cocok dengan domain String seperti "SQL".
HEREDOC mendukung interpolasi secara default atau ketika terminator EOS dikutip ganda:
Interpolasi dapat dinonaktifkan jika terminator EOS dikutip satu kali:
Salah satu batasan penting
<<HEREDOC
adalah bahwa terminator End of String harus berada di awal baris:Untuk menyiasati ini,
<<-
sintaks telah dibuat. Ini memungkinkan terminator EOS untuk membuat indentasi membuat kode terlihat lebih bagus. Garis antara<<-
terminator EOS dan masih digunakan dalam perpanjangan penuh termasuk semua lekukan:Sejak Ruby 2.3, kami sekarang memiliki HEREDOC berlekuk
<<~
menghapus spasi putih terkemuka:Baris dan garis kosong yang hanya berisi tab dan spasi diabaikan oleh << ~
Jika tab dan spasi digunakan, tab dianggap sama dengan 8 spasi. Jika garis yang sedikit berlekuk berada di tengah-tengah tab, tab ini tidak dihapus.
HEREDOC dapat melakukan beberapa hal gila seperti mengeksekusi perintah menggunakan backticks:
Definisi HEREDOC String dapat "ditumpuk", yang berarti bahwa terminator EOS pertama (EOSFOO di bawah) akan mengakhiri string pertama dan memulai yang kedua (EOSBAR di bawah):
Saya tidak berpikir ada orang yang akan menggunakannya seperti itu, tetapi
<<EOS
ini benar-benar hanya string literal dan dapat diletakkan di mana pun string biasanya dapat diletakkan:Jika Anda tidak memiliki Ruby 2.3, tetapi Rails
>=
3.0 maka Anda dapat menggunakanString.strip_heredoc
yang melakukan hal yang sama<<~
Persen String Literal
Lihat RubyDoc untuk bagaimana menggunakan tanda persentase diikuti dengan string dalam kurung pasangan seperti
%(...)
,%[...]
,%{...}
, dll atau sepasang karakter non-alfanumerik seperti%+...+
Kata-kata terakhir
Terakhir, untuk mendapatkan jawaban atas pertanyaan awal "Apakah ada cara untuk menyiratkan penggabungan?" jawab: Ruby selalu menyiratkan penggabungan jika dua string (tunggal dan ganda dikutip) ditemukan kembali ke belakang:
Peringatannya adalah bahwa ini tidak bekerja lintas baris, karena Ruby menafsirkan akhir pernyataan dan garis konsekuen hanya string saja pada suatu garis tidak melakukan apa-apa.
sumber
Jawaban Elegan Hari Ini:
Ada perbedaan dalam
<<-TEXT
dan<<~TEXT
, yang pertama mempertahankan spasi di dalam blok dan yang terakhir tidak.Ada opsi lain juga. Seperti penggabungan dll. Tapi yang ini lebih masuk akal secara umum.
Jika saya salah di sini, beri tahu saya bagaimana ...
sumber
Seperti Anda, saya juga mencari solusi yang tidak termasuk baris baru . (Meskipun mereka mungkin aman dalam SQL, mereka tidak aman dalam kasus saya dan saya memiliki blok teks yang besar untuk ditangani)
Ini bisa dibilang sama jeleknya, tetapi Anda dapat backslash-escape baris baru dalam heredoc untuk menghilangkannya dari string yang dihasilkan:
Perhatikan bahwa Anda tidak dapat melakukan ini tanpa interpolasi (IE
<<~'END_OF_INPUT'
) jadi berhati-hatilah.#{expressions}
akan dievaluasi di sini, sedangkan mereka tidak akan di kode asli Anda. A. Jawaban Wilson mungkin lebih baik karena alasan itu.sumber