2017-06-09 13 views
5

Byłem niedawno dyskusji następującej składni Ruby z kolegą:jeśli instrukcja po przypisaniu zmiennych - jak często?

value = if a == 0 
      "foo" 
     elsif a > 42 
      "bar" 
     else 
      "fizz" 
     end 

Nie widziałem tego rodzaju logiką znacznie osobiście, ale mój kolega stwierdza, że ​​jest to rzeczywiście dość powszechne Rubyism. Próbowałem googlować w temacie i nie znalazłem żadnych artykułów, stron ani pytań SO na temat tego tematu, co sprawiło, że sądzę, że może to być bardzo rzeczowa technika. Innym kolega jednak znajdzie składnia mylące i zamiast tego napisać powyższą logiką takiego:

if a == 0 
    value = "foo" 
elsif a > 42 
    value = "bar" 
else 
    value = "fizz" 
end 

Wadą istnienia powtarzanych deklaracji value = i utratę niejawny else nil, jeśli chcemy go używać. To także sprawia wrażenie, że zawiera wiele innych funkcji syntaktycznego cukru znalezionych w Ruby.

Moje pytanie brzmi, jak powszechna jest ta technika w Rubim? Czy istnieje jakaś zgoda co do tego, czy wspólnota czuje, że powinno się jej używać lub jej unikać?

+1

Powiedziałbym, że to dość idiomatyczne. Często go używam. –

+2

Uwaga: nie jest to stwierdzenie "jeśli", jest to wyrażenie "jeśli" *, które jest dokładnie * dlaczego * to działa w pierwszej kolejności. (W rzeczywistości nie ma żadnych zdań w Ruby, wszystko jest wyrażeniem i wszystko zwraca wartość.) –

+0

Jest podobne do 'x = case (y); kiedy .... 'i' x = (y = 3)? 3: 1', które są powszechne. –

Odpowiedz

4

Fakt if i case zwracane wartości sprawia, że ​​dla niektórych bardzo napięty, schludny, a mimo to zrozumiałe kodu. Jest to typowy wzór w Ruby, gdy masz do czynienia z zadaniem przez rozgałęzienie.

Sposób staram się podejść do formatowania nich jest stosować poziom wcięcia, aby przydział jasne, ale nie przesadnie „push” kod zbyt daleko:

value = 
    if a == 0 
    "foo" 
    elsif a > 42 
    "bar" 
    else 
    "fizz" 
    end 

Albo jeśli chcesz case :

value = 
    case 
    when a == 0 
    "foo" 
    when a > 42 
    "bar" 
    else 
    "fizz" 
    end 

W wielu przypadkach zobaczysz metodę, która ma if jako organ do określenia wynik:

def value(a) 
    if a == 0 
    "foo" 
    elsif a > 42 
    "bar" 
    else 
    "fizz" 
    end 
end 

Nie jest konieczne żadne dziwne wcięcie.

6
value = if condition 
      x 
     else 
      y 
     end 

jest wspólne. Pozwala to na uporządkowanie tej sytuacji:

if condition 
    value = x 
else 
    value = y 
end 

Zobacz przewodnik w stylu Ruby. To popularny przewodnik po tym, jak napisać kod w języku Ruby.

https://github.com/bbatsov/ruby-style-guide#use-if-case-returns

+0

Kiedy, jak tutaj, nie ma 'elsif' trójprzewodnikowe wyrażenie jest zwarte i dobrze czyta:' wartość = warunek? x: y'. –