一行,如果语句不起作用


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

我在想这样的事情?

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

但这是行不通的。Ruby有,||=但我什至不知道如何使用该东西。


目前尚不清楚哪条线不起作用(还是两者都
起作用

Answers:


398

if从中删除if @item.rigged ? "Yes" : "No"

三元运算符具有形式 condition ? if_true : if_false


1
如果您的条件以“?”结尾 有可能掉落吗?即条件是否为@ customer.sales.present?你可以丢掉'?'吗?...别担心。找到我拥有的一些代码并进行了测试。答案是“不”
杰伊·基林

@JayKilleen你是正确的。Ruby只是关于聪明的把戏,但是它是如此的聪明(:
Nikita Rybak

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'

很难理解彼此靠近的多个问号。



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

Shell和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"

唯一的第二个例子是惯用的红宝石
sekmo


2

为简单起见,如果您需要默认设置为nil,则可以使用以下值:

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

1

您可以使用 - -

(@ item.rigged)?“是”:“否”

如果@ item.rigged为true,它将返回“是”,否则将返回“否”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.