Oto, co mam teraz - co wydaje się zbyt szczegółowe, by wykonywać swoją pracę.
@title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
Załóżmy, że tokeny to tablica uzyskana przez podzielenie linii CSV. teraz funkcje takie jak strip! chomp! et. wszystkie zwracają zero, jeśli ciąg nie został zmodyfikowany
"abc".strip! # => nil
" abc ".strip! # => "abc"
Jak Ruby może powiedzieć „przyciąć”, jeśli zawiera dodatkowe spacje wiodące lub końcowe bez tworzenia kopii?
Staje się brzydszy, jeśli chcę tokens[Title].chomp!.strip!
Odpowiedzi:
Myślę, że chcesz:
#strip!
Metoda zwrócinil
gdyby nie pozbawić niczego, a sama zmienna, jeśli został pozbawiony.Zgodnie ze standardami Ruby metoda opatrzona wykrzyknikiem zmienia zmienną na miejscu.
Mam nadzieję że to pomoże.
Aktualizacja: Dane wyjściowe służą
irb
do zademonstrowania:źródło
@title.tap &:strip!
? To wydaje się czystsze niż cokolwiek innego.nil
jeśli czegoś nie rozebra? To bez wątpienia pomieszało mnóstwo ludzi (ponieważ nie ma to sensu).Btw, teraz ruby obsługuje już tylko paski bez „!”.
Porównać:
Nie można też
strip
obejść się bez duplikatów. Zobacz źródła w string.c:ruby 1.9.3p0 (30.10.2011) [i386-mingw32]
Aktualizacja 1: Jak widzę teraz - została utworzona w 1999 roku (patrz rev 372 w SVN):
Aktualizacja 2:
strip!
nie utworzy duplikatów - zarówno w wersjach 1.9.x, 2.x, jak i trunk.źródło
strip!
jest.strip
. Czy coś źle zrozumiałem? Jak inaczej mogę interpretować „niemożliwe do rozebrania bez duplikatu”?strip!
akarb_str_strip_bang
.Nie ma potrzeby zarówno stripowania, jak i chomp, ponieważ strip usunie również końcowe karetki - chyba że zmieniłeś domyślny separator rekordów i właśnie to chompresujesz.
Odpowiedź Olly ma już kanoniczny sposób na zrobienie tego w Ruby, chociaż jeśli często to robisz, zawsze możesz zdefiniować metodę:
Dający:
Należy również pamiętać, że instrukcja if nie pozwoli
@title
na przypisanie, jeśli token ma wartość zero, co spowoduje zachowanie jej poprzedniej wartości. Jeśli chcesz lub nie przeszkadza ci@title
zawsze przydzielanie, możesz przenieść czek do metody i jeszcze bardziej ograniczyć powielanie:Alternatywnie, jeśli masz ochotę na przygodę, możesz zdefiniować metodę na samym łańcuchu znaków:
Podanie jednego z:
źródło
Jeśli używasz Ruby on Rails, istnieje squish
Jeśli używasz tylko Ruby, chcesz użyć paska
Na tym polega gotcha .. w twoim przypadku chcesz użyć paska bez huku!
podczas gdy strip! z pewnością zwraca zero, jeśli nie było żadnej akcji, wciąż aktualizuje zmienną, więc rozbierz się! nie można używać w wierszu. Jeśli chcesz użyć paska inline, możesz użyć wersji bez huku!
rozebrać się! stosując podejście wieloliniowe
odejdź od linii pojedynczej ... ODPOWIEDŹ
źródło
Myślę, że twój przykład jest rozsądnym podejściem, chociaż możesz go nieco uprościć:
Alternatywnie możesz umieścić go w dwóch liniach:
źródło
Jeśli chcesz użyć innej metody, gdy potrzebujesz czegoś takiego:
W ten sposób możesz rozebrać się i nadal coś robić po :)
źródło
Moja droga:
źródło
Jeśli masz wsparcie Ruby 1.9 lub aktywne, możesz to zrobić po prostu
To jest naprawdę fajne, jak to wykorzystuje
:try
i:tap
metody, które są najpotężniejszym konstrukcje funkcjonalne rubin, moim zdaniem.Nawet bardziej ładna forma, przekazująca funkcje jako symbole:
źródło
Jest całkiem możliwe, że nie rozumiem tematu, ale czy nie zrobiłbyś tego, czego potrzebujesz?
źródło