Mam współpracownika, który aktywnie próbuje mnie przekonać, że nie powinienem używać do..end, a zamiast tego używać nawiasów klamrowych do definiowania bloków wielowierszowych w Rubim.
Jestem mocno w obozie, że używam kręconych szelek tylko do krótkich jednolinijkowych i kończę na wszystkim innym. Ale pomyślałem, że dotrę do większej społeczności, aby uzyskać jakieś rozwiązanie.
Więc co to jest i dlaczego? (Przykład jakiegoś kodu powinnya)
context do
setup { do_some_setup() }
should "do somthing" do
# some more code...
end
end
lub
context {
setup { do_some_setup() }
should("do somthing") {
# some more code...
}
}
Osobiście samo spojrzenie na powyższe daje mi odpowiedź na pytanie, ale chciałem otworzyć to dla większej społeczności.
ruby-on-rails
ruby
ruby-on-rails-3
coding-style
Blake Taylor
źródło
źródło
Odpowiedzi:
Ogólną konwencją jest użycie do..end dla bloków wieloliniowych i nawiasów klamrowych dla bloków jednowierszowych, ale istnieje również różnica między nimi, którą można zilustrować na tym przykładzie:
Oznacza to, że {} ma wyższy priorytet niż do..end, więc miej to na uwadze, decydując, czego chcesz użyć.
PS: Jeszcze jeden przykład, o którym należy pamiętać, rozwijając swoje preferencje.
Poniższy kod:
naprawdę oznacza:
A ten kod:
naprawdę oznacza:
Aby uzyskać właściwą definicję, używając nawiasów klamrowych, musisz zrobić:
Być może używanie nawiasów klamrowych jako parametrów jest czymś, co i tak chcesz zrobić, ale jeśli nie, prawdopodobnie najlepiej jest użyć do..end w takich przypadkach, aby uniknąć tego zamieszania.
źródło
puts [1,2,3].map do |k| k+1; end
wypisuje tylko moduł wyliczający, czyli jedno. Czy nie przekazuje tutaj dwóch argumentów, a mianowicie[1,2,3].map
ido |k| k+1; end
?Od programowania Ruby :
Więc kod
Wiąże blok ze
param
zmienną, podczas gdy kodWiąże blok z funkcją
f
.Jednak nie stanowi to problemu, jeśli argumenty funkcji zostaną umieszczone w nawiasach.
źródło
Jest kilka punktów widzenia na ten temat, to naprawdę kwestia osobistych preferencji. Wielu rubinów przyjmuje twoje podejście. Jednak dwa inne wspólne style to zawsze używanie jednego lub drugiego lub używanie
{}
do bloków zwracających wartości orazdo ... end
do bloków wykonywanych z powodu efektów ubocznych.źródło
Jest jedna główna korzyść z nawiasów klamrowych - wielu redaktorów ma DUŻO łatwiejszy czas na ich dopasowanie, co znacznie ułatwia niektóre typy debugowania. Tymczasem słowo kluczowe „do… end” jest nieco trudniejsze do dopasowania, zwłaszcza że „end” również pasuje do „if” s.
źródło
do ... end
domyślnie zaznacza słowa kluczowedo ... end
jest to specjalny przypadek, który wymaga logiki specyficznej dla języka.Najczęstszą regułą, jaką widziałem (ostatnio w Eloquent Ruby ) jest:
źródło
Głosuję na zakończenie / zakończenie
Konwencja dotyczy linii
do .. end
wielowierszowych i{ ... }
jednoliniowych.Ale lubię
do .. end
bardziej, więc kiedy mam jedną linijkę, ido .. end
tak używam, ale formatuję ją jak zwykle, aby wykonać / zakończyć w trzech wierszach. To sprawia, że wszyscy są szczęśliwi.Jednym z problemów
{ }
jest to, że jest on wrogo nastawiony do trybu poezji (ponieważ wiążą się ściśle z ostatnim parametrem, a nie z całym wywołaniem metody, więc musisz uwzględnić parametry metody) i po prostu, moim zdaniem, nie wyglądają tak ładnie. Nie są grupami instrukcji i zderzają się ze stałymi hash dla czytelności.Poza tym widziałem wystarczająco dużo
{ }
w programach C. Sposób Rubiego, jak zwykle, jest lepszy. Jest dokładnie jeden typif
bloku i nigdy nie musisz cofać się i konwertować instrukcji na instrukcję złożoną.źródło
do_stuff if x==1
), który jest trochę denerwujący przy konwersji do zwykłej składni. Ale to inna dyskusja.if
, postfiksif
, postfiksunless
(także rodzajif
, jeśli nie) i jedna liniaif
zthen
. Droga Rubiego polega na posiadaniu wielu sposobów wyrażenia czegoś, co w rzeczywistości jest zawsze to samo, znacznie gorsze niż to, co oferuje C, które podlega bardzo prostym, ścisłym regułom.Kilku wpływowych rubistów sugeruje używanie nawiasów klamrowych, gdy używasz wartości zwracanej, i robienie / kończenie, gdy tego nie robisz.
http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace (na archive.org)
http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc (na archive.org)
Ogólnie wydaje się to dobrą praktyką.
Zmodyfikowałbym nieco tę zasadę, aby powiedzieć, że powinieneś unikać używania do / end w pojedynczym wierszu, ponieważ jest trudniejszy do odczytania.
Musisz być bardziej ostrożny używając nawiasów klamrowych, ponieważ będzie on wiązał się z końcowym parametrem metody zamiast z całym wywołaniem metody. Po prostu dodaj nawiasy, aby tego uniknąć.
źródło
Właściwie to osobiste preferencje, ale powiedziawszy to, przez ostatnie 3 lata moich doświadczeń z rubinem nauczyłem się, że rubin ma swój styl.
Jednym z przykładów może być metoda logiczna, której możesz użyć, jeśli wychodzisz z tła JAVA
zwróć uwagę na przypadek wielbłąda i najczęściej przedrostek „jest”, aby zidentyfikować go jako metodę boolowską.
Ale w świecie rubinów byłaby ta sama metoda
więc osobiście uważam, że lepiej jest pójść na „rubinową drogę” (ale wiem, że zrozumienie zajmuje mi trochę czasu (zajęło mi to około 1 roku: D)).
Wreszcie pójdę z
Bloki.
źródło
Umieściłem kolejną odpowiedź, chociaż wskazano już dużą różnicę (pierwszeństwo / wiązanie), a to może powodować trudne do znalezienia problemy (zwrócił na to uwagę Blaszany Człowiek i inni). Myślę, że mój przykład pokazuje problem z niezbyt zwykłym fragmentem kodu, nawet doświadczeni programiści nie czytają jak w niedzielę:
Potem zrobiłem kod upiększający ...
jeśli zmienisz
{}
tutaj nado/end
to otrzymasz błąd, ta metodatranslate
nie istnieje ...Dlaczego tak się dzieje, wskazuje się tutaj więcej niż jeden - pierwszeństwo. Ale gdzie tu założyć aparat? (@ The Tin Man: zawsze używam szelek, tak jak ty, ale tutaj ... przeoczony)
więc każda odpowiedź jak
jest po prostu błędne, jeśli jest używane bez „ALE Miej oko na nawiasy klamrowe / pierwszeństwo!”
jeszcze raz:
i
(co kiedykolwiek wynik rozszerzenia robi z blokiem ...)
Więc jeśli chcesz użyć do / end, użyj tego:
źródło
Sprowadza się do osobistych uprzedzeń, wolę nawiasy klamrowe zamiast bloku do / końca, ponieważ jest on bardziej zrozumiały dla większej liczby programistów, ponieważ większość języków tła używa ich zamiast konwencji do / end. Mając to na uwadze, prawdziwym kluczem jest osiągnięcie porozumienia w twoim sklepie, jeśli do / end jest używane przez 6/10 programistów, to WSZYSCY powinni ich używać, jeśli 6/10 używa nawiasów klamrowych, trzymaj się tego paradygmatu.
Chodzi o stworzenie wzorca, aby zespół jako całość mógł szybciej identyfikować struktury kodu.
źródło
Jest między nimi subtelna różnica, ale {} wiąże mocniej niż do / end.
źródło
Mój osobisty styl to kładzenie nacisku na czytelność ponad sztywne zasady
{
...}
vsdo
...end
wyboru, kiedy taki wybór jest możliwy. Mój pomysł na czytelność jest następujący:W bardziej złożonej składni, takiej jak wielowierszowe zagnieżdżone bloki, staram się przeplatać
{
...}
ido
...end
ograniczniki, aby uzyskać jak najbardziej naturalny wynik, np.Chociaż brak sztywnych reguł może skutkować nieznacznie różnymi wyborami dla różnych programistów, uważam, że optymalizacja dla czytelności dla każdego przypadku, choć subiektywna, jest korzyścią netto w stosunku do przestrzegania sztywnych reguł.
źródło
Ruby
to najlepszy pragmatyczny język. Powinienem powiedzieć język skryptowy. Dzisiaj myślę, że równie dobrze byś się uczyłBrainfuck
.Wziąłem tutaj przykład najczęściej głosowanej odpowiedzi. Mówić,
Jeśli sprawdzisz jaką wewnętrzną implementację w array.rb, nagłówek metody map mówi :
Invokes the given block once for each element of self.
tj. akceptuje blok kodu - cokolwiek jest pomiędzy do i end jest wykonywane jako yield. Następnie wynik zostanie ponownie zebrany jako tablica, a więc zwróci zupełnie nowy obiekt.
źródło
Jest trzecia opcja: Napisz preprocesor, który na podstawie wcięcia będzie wywnioskował „koniec” w swoim własnym wierszu. Głęboko myślący, którzy wolą zwięzły kod, mają rację.
Jeszcze lepiej, zhakuj rubin, więc to jest flaga.
Oczywiście najprostszym rozwiązaniem typu „wybierz swoje walki” jest przyjęcie konwencji stylistycznej, zgodnie z którą sekwencja końcówek występuje w tej samej linii i nauczenie kolorowania składni, aby je wyciszyć. Aby ułatwić edycję, można użyć skryptów edytora, aby rozwinąć / zwinąć te sekwencje.
Od 20% do 25% moich wierszy kodu ruby kończy się w osobnym wierszu, wszystko to w trywialny sposób wywnioskowane przez moje konwencje wcięć. Ruby to język podobny do seplenienia, który odniósł największy sukces. Kiedy ludzie kwestionują to, pytając, gdzie są te wszystkie upiorne nawiasy, pokazuję im funkcję rubinową kończącą się siedmioma liniami zbędnego „końca”.
Kodowałem przez lata, używając preprocesora lisp, aby wywnioskować większość nawiasów: Pasek '|' otworzył grupę, która automatycznie zamknęła się na końcu wiersza, a znak dolara „$” służył jako pusty symbol zastępczy, w którym w przeciwnym razie nie byłoby symboli pomagających w określeniu grup. To oczywiście terytorium wojny religijnej. Lisp / schemat bez nawiasów jest najbardziej poetyckim ze wszystkich języków. Mimo to łatwiej jest po prostu wyciszyć nawiasy za pomocą kolorowania składni.
Nadal koduję z preprocesorem dla Haskella, aby dodać heredoc i domyślnie wszystkie puste wiersze jako komentarze, wszystko wcięte jako kod. Nie lubię komentować postaci, niezależnie od języka.
źródło