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' 

Как, има ли начин да се подразбира конкатенация?

278
25 февр. Зомбитата са поставени на 25 февруари 2010-02-25 23:48 '10 в 23:48 2010-02-25 23:48
@ 13 отговора

Има части от този отговор, които ми помогнаха да получа това, от което имам нужда (лесна конкатенация с няколко реда без допълнителни интервали), но тъй като нито един от действителните отговори не го имаше, аз ги компилирам тук:

 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" 

Последното се отнася главно за ситуации, изискващи по-голяма гъвкавост при работа. Аз лично не ми харесва, той поставя обработката в странно място на линията wrt (т.е. пред нея, но използвайки методите, които обикновено се появяват след това), но там. Обърнете внимание, че ако END_SQL върнете от последния END_SQL идентификатор (който е често срещан, тъй като вероятно е във функция или модул), ще трябва да използвате преносим синтаксис (т.е. p <<-END_SQL вместо p <<END_SQL ) , В противен случай интервалите на интервалите причиняват идентификаторът да бъде интерпретиран като продължение на линията.

Това не спестява много вход, но за мен това изглежда по-добре, отколкото с + знаци.

EDIT: добавяне на още едно:

 p %{ SELECT * FROM users ORDER BY users.id DESC }.gsub(/\s+/, " ").strip # >> "SELECT * FROM users ORDER BY users.id DESC" 
405
17 мая '11 в 18:06 2011-05-17 18:06 Отговорът е даден от А. Уилсън на 17 май'11 в 18:06 2011-05-17 18:06

Да, ако нямате нищо против да добавите допълнителни редове:

  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' 
border=0

Като алтернатива можете да използвате 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 
143
25 февр. Отговор от Марк Байерс 25 февруари 2010-02-25 23:50 '10 в 23:50 ч. 2010-02-25 23:50

В ruby ​​2.0 сега можете просто да използвате %

Например:

 SQL = %{ SELECT user, name FROM users WHERE users.id = #{var} LIMIT #{var2} } 
128
28 авг. Отговорът е даден от Robbie Guilfoyle 28 август. 2013-08-28 04:33 '13 в 4:33 2013-08-28 04:33

Има няколко синтаксиса за многолинейни низове, които вече сте прочели. Моят любим стил на 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, последван от {, [или (и след това завършва със съответната обратно наклонена черта.% Q не позволява интерполация,% 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 или heredocs, както предполагат Марк и Питър, ще получите потенциално ненужни интервали. Както в моите примери, така и в примерите им, редовете "от" и "където" съдържат водещи пространства, поради тяхното отстъпване в кода. Ако това пространство не е необходимо, трябва да използвате конкатенирани низове, както правите сега.

46
26 февр. Отговор, даден от Хонли на 26 февруари. 2010-02-26 12:13 '10 в 12:13 2010-02-26 12:13

Понякога си струва да премахнете новите знаци на низ, например:

 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 
24
16 июля '14 в 9:57 2014-07-16 09:57 отговорът е даден squixy 16 юли '14 в 9:57 2014-07-16 09:57
 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 
14
25 февр. Отговорът е даден от Петър на 25 февруари. 2010-02-25 23:51 '10 в 23:51 2010-02-25 23:51

Можете да използвате и три двойни кавички.

 x = """ this is a multiline string """ 2.3.3 :012 > x => "\nthis is\na multiline\nstring\n" 

Ако трябва да премахнете прекъсвания на редовете "", използвайте обратна наклонена черта "в края на всеки ред.

8
29 марта '17 в 18:39 2017-03-29 18:39 отговорът е даден от juliangonzalez на 29 март 2017 г. в 18:39 2017-03-29 18:39
 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' 

<< е операторът на конкатенацията за низове

6
25 февр. Отговорът е даден от Дом Брезински на 25 февруари. 2010-02-25 23:52 '10 в 23:52 ч. 2010-02-25 23:52

Ако не включвате допълнителни интервали и нови редове, можете да ги използвате

 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 за интерполирани низове)

5
13 марта '13 в 1:09 2013-03-13 01:09 отговорът е даден на UncleGene 13 март '13 в 1:09 2013-03-13 01:09

Други опции:

 #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 
5
28 дек. Отговор, даден от Алекс Коен на 28 декември. 2016-12-28 22:03 '17 в 22:03 часа 2016-12-28 22:03
 conn.exec [ "select attr1, attr2, attr3, ...", "from table1, table2, table3, ...", "where ..." ].join(' ') 

Тази оферта има предимство пред документите и дългите линии, които автоиндустриращите могат по подходящ начин да се отклоняват от всяка част на линията. Но това се постига чрез ефективност.

3
25 февр. Отговорът е даден от Айдан Кули 25 февруари. 2010-02-25 23:56 '10 в 23:56 2010-02-25 23:56

Наскоро, с нови функции в Ruby 2.3, новият squiggly HEREDOC ще ви позволи да пишете нашите многолинейни низове по красив начин с минимална промяна, така че използването му в комбинация с .squish ще ви позволи да пишете многоредови изображения по един добър начин!

 [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" 

ref: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

1
01 окт. Отговор, даден от Mark Jad Oct 01 2017-10-01 14:42 '17 в 14:42 2017-10-01 14:42

За да избегнете затварянето на скоби за всеки ред, можете просто да използвате двойни кавички с обратна наклонена черта, за да излезете от новия ред:

 "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" 
1
15 июня '16 в 19:34 2016-06-15 19:34 отговорът е даден Pwnrar 15 юни 16 в 19:34 2016-06-15 19:34

Други въпроси за или Задайте въпрос