To wydaje się absurdalnie proste pytanie, które należy zadać, ale jaki jest najkrótszy/najbardziej idiomatyczny sposób przepisywania tego w Ruby?Jaki jest najkrótszy/najbardziej idiomatyczny sposób określania, czy zmienna jest jedną z listy wartości?
if variable == :a or variable == :b or variable == :c or variable == :d # etc.
widziałem tego rozwiązania:
if [:a, :b, :c, :d].include? variable
ale nie zawsze jest to funkcjonalny odpowiednik - Wierzę Array#include?
faktycznie sprawdza, czy zmienna obiekt jest umieszczony w wykazie; nie bierze pod uwagę, że obiekt może wdrożyć własny test równości z def ==(other)
.
Jak zauważyli pomocni komentatorzy poniżej, wyjaśnienie to jest nieprawidłowe. include?
używa ==
, ale używa metody ==
elementów w tablicy. W moim przykładzie chodzi raczej o symbole, niż o metodę zmiennej. To wyjaśnia, dlaczego nie jest to równoważne z moim pierwszym przykładem kodu.
(Weźmy, na przykład, Mime::Type
realizacja szyn: request.format == :html
może powrócić prawda, ale [:html].include?(request.format)
zwróci false, jak request.format
jest instancją Pantomimy :: typ, a nie symboli.)
Najlepszym Mam do tej pory jest:
if [:a, :b, :c, :d].select {|f| variable == f}.any?
, ale wydaje się nieco uciążliwe dla mnie. Czy ktoś ma lepsze sugestie?
myślę, że „Każdy” składnia wydaje się dość czyste. Ale jestem C# i tt sorta odzwierciedla, jak wygląda LINQ, więc jestem stronniczy. –
Dokumentacja stwierdza: Array # include? Zwraca wartość true, jeśli dany obiekt jest obecny w self (to znaczy, jeśli dowolny obiekt == anObject), w przeciwnym razie false. – khelll
Zastanawiam się, czy zaimplementowanie metody isOneOf? (Array) w klasie Object nie jest uważane za dobrą praktykę w Ruby, mam na myśli, rozmyślanie z klasami podstawowymi (oczywiście, nie mam doświadczenia z rubinem) ... w każdym razie, byłoby w porządku, jeśli ktoś może opublikować taką metodę ... – opensas