Czy istnieje sposób, aby ten wyglądał trochę lepiej?
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'
Czy istnieje sposób na sugerowanie konkatenacji?
ruby
code-formatting
Zombie
źródło
źródło
Odpowiedzi:
W tej odpowiedzi są fragmenty, które pomogły mi uzyskać to, czego potrzebowałem (łatwe łączenie wielu wierszy BEZ dodatkowej białej spacji), ale ponieważ żadna z rzeczywistych odpowiedzi nie zawierała tego, kompiluję je tutaj:
Jako bonus, oto wersja z zabawną składnią HEREDOC (poprzez ten link ):
To ostatnie dotyczyłoby głównie sytuacji wymagających większej elastyczności przetwarzania. Osobiście mi się to nie podoba, umieszcza przetwarzanie w dziwnym miejscu przed łańcuchem (tj. Przed nim, ale przy użyciu metod instancji, które zwykle pojawiają się później), ale tam jest. Zauważ, że jeśli wcinasz ostatni
END_SQL
identyfikator (który jest wspólny, ponieważ prawdopodobnie znajduje się on w funkcji lub module), będziesz musiał użyć składni dzielonej (to znaczyp <<-END_SQL
zamiastp <<END_SQL
). W przeciwnym razie wcięcie białych znaków powoduje interpretację identyfikatora jako kontynuacji ciągu.Nie oszczędza to dużo pisania, ale dla mnie wygląda ładniej niż używanie znaków +.
Również (mówię w edycji, kilka lat później), jeśli używasz Ruby 2.3+, dostępny jest również operator << ~ , który usuwa dodatkowe wcięcia z ostatniego ciągu. W takim przypadku powinieneś być w stanie usunąć
.gsub
wywołanie (chociaż może to zależeć zarówno od początkowego wcięcia, jak i twoich ostatecznych potrzeb).EDYCJA: Dodanie jeszcze jednego:
źródło
p <<END_SQL
powinno byćp <<-END_SQL
W przeciwnym razie jest to Odpowiedź. opcjonalnie możesz usunąć wiodące białe znaki za pomocą squiggly operatora HEREDOC,<<~END_SQL
<<~
do odpowiedzi byłoby fajne, w końcu badałem to stamtąd. Osobiście używam,<<~MSG.strip ... MSG
który usuwa również ostatni\n
.W Ruby 2.0 możesz teraz po prostu używać
%
Na przykład:
źródło
squish
wyjścia powinno być pomocne.Tak, jeśli nie przeszkadza ci wstawianie dodatkowych znaków nowej linii:
Alternatywnie możesz użyć heredoc :
źródło
%Q(...)
%(...)
Istnieje wiele składni ciągów wieloliniowych, które już przeczytałeś. Moim ulubionym jest styl Perla:
Ciąg wieloliniowy zaczyna się od% q, po którym następuje {, [lub (, a następnie kończy się odpowiednim odwróconym znakiem.% Q nie zezwala na interpolację;% Q robi to, abyś mógł napisać takie rzeczy:
Właściwie nie mam pojęcia, jak nazywane są tego rodzaju ciągi wieloliniowe, więc nazwijmy je multilinią Perl.
Zauważ jednak, że niezależnie od tego, czy używasz multilinii Perla, czy heredoków, jak sugerowali Mark i Peter, skończysz z potencjalnie niepotrzebnymi białymi spacjami. Zarówno w moich przykładach, jak i ich przykładach, linie „from” i „where” zawierają wiodące białe znaki ze względu na ich wcięcia w kodzie. Jeśli ten biały znak nie jest pożądany, musisz użyć połączonych łańcuchów, tak jak teraz.
źródło
%q
rodziny będą zawierać nowe wiersze, które nie są równoważne z oryginalnym kodem.Czasami warto usunąć nowe znaki wiersza,
\n
takie jak:źródło
Możesz także użyć podwójnych cudzysłowów
Jeśli to konieczne, aby usunąć podziały wiersza „\ n”, użyj ukośnika odwrotnego „\” na końcu każdej linii
źródło
"" + "double quotes with some content" + ""
."x"
wygląda lepiej i działa szybciej niż"""x"""
(który jest w zasadzie taki sam jak""+"x"+""
) lub"""""x"""""
(który jest taki sam jak"" + "" + "x" + "" + ""
). To Ruby, a nie Python, którego używasz"""
zamiast,"
gdy potrzebujesz ciągu wieloliniowego.źródło
Inne opcje:
źródło
<<EOM
na<<-EOM
, nie?<<-EOF
przykład. Domyślam się, że tak czy inaczej działa.Niedawno dzięki nowym funkcjom w Ruby 2.3 nowy
squiggly HEREDOC
pozwoli ci napisać nasze ciągi wielowierszowe w przyjemny sposób przy minimalnej zmianie, więc użycie tego w połączeniu z.squish
(jeśli używasz szyn) pozwoli ci pisać w sposób przyjemny! w przypadku tylko przy użyciu Ruby, można zrobić<<~SQL.split.join(" ")
co jest prawie taka samaref: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc
źródło
<< jest operatorem konkatenacji ciągów znaków
źródło
+
jest zwykłym operatorem konkatenacji,<<
jest operatorem dołączającym w miejscu . Przydaje się tutaj stosowanie efektów ubocznych w dosłowności (pierwszy ciąg jest dwukrotnie modyfikowany i zwracany), ale IMHO jest dziwny i sprawia, że robię podwójne ujęcie,+
co byłoby całkowicie jasne. Ale może jestem po prostu nowy dla Ruby ...frozen_string_literal
jest włączoneJeśli masz na myśli dodatkowe spacje i znaki nowej linii, możesz użyć
(użyj% W dla interpolowanych ciągów)
źródło
Aby uniknąć zamykania nawiasów dla każdej linii, możesz po prostu użyć podwójnych cudzysłowów z odwrotnym ukośnikiem, aby wyjść z nowej linii:
źródło
Ta sugestia ma tę przewagę nad dokumentami i długimi łańcuchami, że automatyczne wcięcia mogą odpowiednio wciąć każdą część łańcucha. Ale ma to koszt wydajności.
źródło
Ruby-way (TM) od Ruby 2.3: Aby zdefiniować wieloliniowy ciąg znaków z nowymi liniami i prawidłową identyfikacją, użyj zawijasowego HEREDOC
<<~
:Jeśli poprawna identyfikacja nie stanowi problemu, wówczas pojedyncze i podwójne cudzysłowy mogą obejmować wiele wierszy w języku Ruby:
Jeśli pojedyncze lub podwójne cudzysłowy są kłopotliwe, ponieważ wymagałoby to mnożenia znaków ucieczki, to oznaczenie literału procentowego ciągu
%
jest najbardziej elastycznym rozwiązaniem:Jeśli celem jest uniknięcie nowych linii (które spowodują zarówno zawijany HEREDOC, cudzysłowy, jak i procent literału łańcucha), to odwrotny ukośnik, jako ostatni znak niebiałej spacji, będzie kontynuował linię i spowoduje, że Ruby połączy łańcuchy z powrotem do tyłu (uważaj na spacje w cytowanym ciągu):
Jeśli używasz Railsów,
String.squish
usunie ciąg początkowej i końcowej spacji i zwinie wszystkie kolejne białe spacje (znaki nowej linii, tabulatory i wszystkie) w jedną spację:Więcej szczegółów:
Ruby Składnia HEREDOC
Działa tutaj notacja dokumentacyjna dla ciągów znaków, która jest sposobem na oznaczenie długich bloków tekstu w kodzie. Po nim
<<
następuje zdefiniowany przez użytkownika ciąg znaków (terminator końca łańcucha). Wszystkie następujące wiersze są konkatenowane do momentu znalezienia terminatora End of String na samym początku wiersza:Terminator końca łańcucha można wybierać dowolnie, ale często używa się czegoś takiego jak „EOS” (koniec łańcucha) lub czegoś, co pasuje do domeny łańcucha, np. „SQL”.
HEREDOC domyślnie obsługuje interpolację lub gdy podwójny cudzysłów terminatora EOS:
Interpolację można wyłączyć, jeśli terminator EOS jest cytowany:
Jednym ważnym ograniczeniem
<<HEREDOC
jest to, że terminator końca łańcucha musi znajdować się na początku wiersza:Aby obejść ten problem, utworzono
<<-
składnię. Umożliwia wcięcie terminatora EOS, dzięki czemu kod wygląda ładniej. Linie między<<-
terminatorem i terminatorem EOS są nadal używane w pełnym zakresie, włączając wszystkie wcięcia:Od Ruby 2.3 mamy teraz zawijas HEREDOC
<<~
usuwa wiodące białe znaki:Puste linie i linie zawierające tylko tabulatory i spacje są ignorowane przez << ~
Jeśli używane są zarówno tabulatory, jak i spacje, tabulatory są traktowane jako równe 8 spacjom. Jeśli linia z najmniejszymi wcięciami znajduje się na środku karty, karta ta nie jest usuwana.
HEREDOC może robić szalone rzeczy, takie jak wykonywanie poleceń za pomocą odwrotnych poleceń:
Definicje ciągów HEREDOC można „ustawiać w stos”, co oznacza, że pierwszy terminator EOS (poniżej EOSFOO) zakończy pierwszy ciąg i rozpocznie drugi (poniżej EOSBAR):
Nie sądzę, aby ktokolwiek kiedykolwiek używałby go jako takiego, ale
<<EOS
tak naprawdę jest to dosłownie ciąg znaków i można go umieścić wszędzie tam, gdzie zwykle można go umieścić:Jeśli nie masz Ruby 2.3, ale Rails
>=
3.0, możesz użyćString.strip_heredoc
tego samego co<<~
Procent literałów łańcuchowych
Zobacz RubyDoc do sposobu korzystania z znak procentu po którym następuje ciąg w nawiasach powiązać takie jak
%(...)
,%[...]
,%{...}
, itd. Lub parę jakiegokolwiek charakteru niealfanumeryczne takich jak%+...+
Ostatnie słowa
Wreszcie, aby uzyskać odpowiedź na pierwotne pytanie „Czy istnieje sposób sugerowania konkatenacji?” odpowiedział: Ruby zawsze oznacza konkatenację, jeśli dwa ciągi (pojedyncze i podwójne cudzysłowy) zostaną znalezione jeden po drugim:
Zastrzeżenie polega na tym, że nie działa to w przypadku łamania linii, ponieważ Ruby interpretuje koniec instrukcji, a wynikowa linia samych ciągów w linii nic nie robi.
źródło
Elegancka odpowiedź dzisiaj:
Istnieje różnica w,
<<-TEXT
i<<~TEXT
pierwszy zachowuje odstępy wewnątrz bloku, a drugi nie.Istnieją również inne opcje. Podobnie jak konkatenacja itp., Ale ogólnie rzecz biorąc ma to większy sens.
Jeśli się tutaj mylę, daj mi znać, jak ...
źródło
Podobnie jak ty szukałem również rozwiązania, które nie obejmuje nowych linii . (Chociaż mogą być bezpieczne w SQL, w moim przypadku nie są bezpieczne, a ja mam duży blok tekstu do załatwienia)
Jest to prawdopodobnie równie brzydkie, ale możesz w ukośniku heredoc uciec przed ukośnikiem, aby pominąć je w powstałym ciągu:
Pamiętaj, że nie można tego zrobić bez interpolacji (IE
<<~'END_OF_INPUT'
), więc bądź ostrożny.#{expressions}
zostaną ocenione tutaj, ale nie będą w twoim oryginalnym kodzie. Odpowiedź A. Wilsona może być z tego powodu lepsza.źródło