Jak ? :
używany jest operator warunkowy ( ) w Ruby?
Na przykład, czy to jest poprawne?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
ruby
ternary-operator
conditional-operator
Mithun Sreedharan
źródło
źródło
question=question[0,20]
Jeśli byłby mniejszy niż 20, nie zmieni tego.Odpowiedzi:
Jest to operator trójskładnikowy i działa jak w C (nawiasy nie są wymagane). To wyrażenie działa jak:
Jednak w Ruby
if
jest także wyrażenie:if a then b else c end
===a ? b : c
, z wyjątkiem kwestii pierwszeństwa. Oba są wyrażeniami.Przykłady:
Zauważ, że w pierwszym przypadku wymagane są nawiasy (w przeciwnym razie Ruby jest zdezorientowana, ponieważ uważa, że jest
puts if 1
z dodatkowymi śmieciami), ale w ostatnim przypadku nie są one wymagane, ponieważ wspomniany problem nie pojawia się.Możesz użyć formularza „long-if” dla czytelności w wielu wierszach:
źródło
nil
ifalse
. Rzeczywiście niezbyt często.źródło
puts (true ? "true" : "false")
z nawiasami. W przeciwnym razie kolejność operacji nie jest jasna. Kiedy po raz pierwszy to przeczytałem, byłem zdezorientowany, ponieważ czytałem to, ponieważ(puts true) ? "true" : "false"
spodziewałemputs
się zwrócić wartość logiczną, która następnie stała się wartością ciągu.Twoje użycie ERB sugeruje, że jesteś w Railsach. Jeśli tak, to weź pod uwagę
truncate
wbudowanego pomocnika, który wykona za Ciebie zadanie:źródło
@pst dał świetną odpowiedź, ale chciałbym wspomnieć, że w Ruby operator trójskładnikowy jest napisany w jednym wierszu, aby był poprawny pod względem składniowym, w przeciwieństwie do Perla i C, gdzie możemy napisać go w wielu wierszach:
Normalnie Ruby zgłosi błąd, jeśli spróbujesz podzielić go na wiele linii, ale możesz użyć
\
symbolu kontynuacji linii na końcu linii, a Ruby będzie szczęśliwa:Jest to prosty przykład, ale może być bardzo przydatny w przypadku dłuższych linii, ponieważ utrzymuje ładnie ułożony kod.
Możliwe jest również użycie trójki bez znaków kontynuacji linii poprzez umieszczenie operatorów na końcu linii, ale mi się to nie podoba lub nie polecam:
Myślę, że prowadzi to do naprawdę trudnego do odczytania kodu, ponieważ test warunkowy i / lub wyniki stają się dłuższe.
Czytałem komentarze mówiące, aby nie używać operatora trójskładnikowego, ponieważ jest to mylące, ale to zły powód, aby czegoś nie używać. Zgodnie z tą samą logiką nie powinniśmy używać wyrażeń regularnych, operatorów zakresów („
..
” i pozornie nieznanej odmiany „flip-flop”). Są potężne, gdy są właściwie używane, dlatego powinniśmy nauczyć się ich poprawnie używać.Rozważ przykład PO:
Zawijanie testu warunkowego pomaga uczynić go bardziej czytelnym, ponieważ wizualnie oddziela test:
Oczywiście cały przykład można uczynić o wiele bardziej czytelnym, stosując rozsądne dodatki do białych znaków. To nie zostało przetestowane, ale wpadniesz na pomysł:
Lub, bardziej napisane bardziej idiomatycznie:
Łatwo byłoby argumentować, że czytelność również bardzo ucierpiała
question.question
.źródło
true
?true
tak naprawdę zasiada za czymś, co byłoby wyrażeniem, które ocenia natrue
lubfalse
. Lepiej oddzielić je wizualnie, ponieważ potrójne stwierdzenia mogą szybko przekształcić się w szum wizualny, zmniejszając czytelność, co wpływa na łatwość konserwacji.Prosty przykład, w którym operator sprawdza, czy identyfikator gracza wynosi 1, i ustawia identyfikator wroga w zależności od wyniku
I znalazłem post na ten temat, który wydaje się bardzo pomocny.
źródło
enemy_id = player_id == 1 ? 2 : 1
?Kod
condition ? statement_A : statement_B
jest równoważny zźródło
Najprostszy sposób:
ponieważ
param_a
nie jest równa,param_b
wówczasresult
wartość będzieNot same!
źródło