Одна строка, если оператор не работает

192
<%if @item.rigged %>Yes<%else%>No<%end%>

Я думал о чем-то вроде этого?

if @item.rigged ? "Yes" : "No" 

Но это не работает. Руби есть, ||=но я даже не уверен, как использовать эту вещь.

RoR
источник
Непонятно, какая линия не работает (или это и то и другое?)
ymoreau

Ответы:

401

Удалить ifизif @item.rigged ? "Yes" : "No"

Тернарный оператор имеет форму condition ? if_true : if_false

Никита Рыбак
источник
1
Если ваше условие оканчивается на '?' можно ли его уронить? Т.е. если условие @ customer.sales.present? Вы можете бросить «?»? ... не волнуйся Нашел какой-то код и проверил его. Ответ «нет»
Джей Киллин
@JayKilleen Ты прав. Рубин все о хитрых трюков, но это что умный (:
Никита Рыбак
1
@NikitaRybak s/that/not that :)
Остин
180

В 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'

Это просто трудно читать с несколькими вопросительными знаками, которые находятся близко друг к другу.

Йорг Миттаг
источник
74

Одна строка, если:

<statement> if <condition>

Ваш случай:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Бакир Юсуфбегович
источник
14
Или "No" unless @item.riggedчтобы предотвратить!
Вегер
Это решение отличается тем, что оно возвращает nilвместо 'Yes'if значение item.riggedtrue. Однострочный, если или если операторы не возвращаются, nilесли условие не выполняется.
Pellmeister
23

Из того, что я знаю

3 однострочника

  1. a = 10 if <condition>

пример:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

пример:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

пример:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

Я надеюсь, что это помогает.

Алан Донг
источник
2
Собака Это лучший ответ - мне нравится, как лаконично это контрастирует во всех трех отношениях. Спасибо!
MrVocabulary
7

Обе конструкции и оболочка 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"
отметка
источник
только второй пример - идиоматический рубин
sekmo
7

если еще условие может быть покрыто троичным оператором

@item.rigged? ? 'Yes' : 'No'
нитаншу верма
источник
2

Для простоты, если вам нужно по умолчанию какое-то значение, если ноль, вы можете использовать:

@something.nil? = "No" || "Yes"
aabiro
источник
1

Ты можешь использовать ----

(@ item.rigged)? "Да нет"

Если @ item.rigged имеет значение true, он вернет «Да», иначе он вернет «Нет»

Снм Маурья
источник