Один рядок, якщо заява не працює


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

Я думав про щось подібне?

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

Але це не працює. У Рубі є, ||=але я навіть не впевнений, як використовувати цю річ.


Незрозуміло, яка лінія не працює (чи це обоє?)
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, вам потрібен оператор.

У Рубі, проте, ifце вираз. Насправді в Ruby все є виразом, тому воно вже може повернути значення. Немає потреби в умовному операторі навіть існувати , не кажучи вже про його використання.

BTW: прийнято називати методи, які використовуються для того, щоб задавати питання із знаком питання в кінці, як це:

@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'якщо item.riggedє істинним. Однорядковий, якщо або якщо заяви не повертаються, nilякщо умова не виконується.
The 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 (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"

єдиний другий приклад - ідіоматичний рубін
секмо,


2

Для простоти: Якщо вам потрібне значення за замовчуванням, якщо нуль, ви можете використовувати:

@something.nil? = "No" || "Yes"

1

Ви можете використовувати ----

(@ item.rigged)? "Так ні"

Якщо @ item.rigged вірно, він поверне "Так", інакше поверне "Ні"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.