Ответы:
Удалить if
изif @item.rigged ? "Yes" : "No"
Тернарный оператор имеет форму condition ? if_true : if_false
s/that/not that
:)
В Ruby условие и then
часть if
выражения должны быть разделены разделителем выражений (т. ;
Е. Или символом новой строки) или then
ключевым словом.
Итак, все это будет работать:
if @item.rigged then 'Yes' else 'No' end
if @item.rigged; 'Yes' else 'No' end
if @item.rigged
'Yes' else 'No' end
В Ruby также есть условный оператор, но это совершенно не нужно. Условный оператор необходим в C, поскольку он является оператором: в C он if
является оператором и, следовательно, не может возвращать значение, поэтому, если вы хотите вернуть значение, вам нужно использовать что-то, что может вернуть значение. И единственные вещи в C, которые могут возвращать значение, это функции и операторы, и поскольку невозможно создать if
функцию в C, вам нужен оператор.
В Ruby, однако, if
есть выражение. Фактически, все является выражением в Ruby, поэтому оно уже может возвращать значение. Нет необходимости даже в существовании условного оператора , не говоря уже о его использовании.
КСТАТИ: обычно принято называть методы, которые используются, чтобы задать вопрос с вопросительным знаком в конце, например:
@item.rigged?
Это показывает еще одну проблему с использованием условного оператора в Ruby:
@item.rigged? ? 'Yes' : 'No'
Это просто трудно читать с несколькими вопросительными знаками, которые находятся близко друг к другу.
Одна строка, если:
<statement> if <condition>
Ваш случай:
"Yes" if @item.rigged
"No" if !@item.rigged # or: "No" unless @item.rigged
"No" unless @item.rigged
чтобы предотвратить!
nil
вместо 'Yes'
if значение item.rigged
true. Однострочный, если или если операторы не возвращаются, nil
если условие не выполняется.
Из того, что я знаю
3 однострочника
a = 10 if <condition>
пример:
a = 10 if true # a = 10
b = 10 if false # b = nil
a = 10 unless <condition>
пример:
a = 10 unless false # a = 10
b = 10 unless true # b = nil
a = <condition> ? <a> : <b>
пример:
a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100
Я надеюсь, что это помогает.
Обе конструкции и оболочка C-line работают (ruby 1.9.3p429):
# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"
# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"
если еще условие может быть покрыто троичным оператором
@item.rigged? ? 'Yes' : 'No'
Ты можешь использовать ----
(@ item.rigged)? "Да нет"
Если @ item.rigged имеет значение true, он вернет «Да», иначе он вернет «Нет»