一行if语句不起作用

RoR*_*RoR 180 ruby

<%if @item.rigged %>Yes<%else%>No<%end%>
Run Code Online (Sandbox Code Playgroud)

我在想这样的事情?

if @item.rigged ? "Yes" : "No" 
Run Code Online (Sandbox Code Playgroud)

但它不起作用.Ruby有,||=但我甚至不确定如何使用那个东西.

Nik*_*bak 386

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

三元运营商有形式 condition ? if_true : if_false

  • @NikitaRybak `s/that/not that` :) (3认同)

Jör*_*tag 177

在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
Run Code Online (Sandbox Code Playgroud)

Ruby中也有一个条件运算符,但这完全没必要.C中需要条件运算符,因为它是一个运算符:在C中,if是一个语句,因此不能返回一个值,所以如果你想返回一个值,你需要使用一些可以返回值的东西.C中唯一可以返回值的东西是函数和运算符,因为不可能if在C中创建函数,所以需要一个运算符.

然而,在Ruby中,if是一个表达式.事实上,一切都是Ruby中的表达式,因此它已经可以返回一个值.条件运算符甚至不需要存在,更不用说使用它了.

顺便说一句:按惯例命名用于在末尾用问号提问的方法,如下所示:

@item.rigged?
Run Code Online (Sandbox Code Playgroud)

这显示了在Ruby中使用条件运算符的另一个问题:

@item.rigged? ? 'Yes' : 'No'
Run Code Online (Sandbox Code Playgroud)

使用彼此接近的多个问号很难阅读.


Bak*_*vic 63

一行如果:

<statement> if <condition>
Run Code Online (Sandbox Code Playgroud)

你的情况:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Run Code Online (Sandbox Code Playgroud)

  • 或者"否",除非@ item.rigged`以防止`!` (13认同)

Ala*_*ong 19

据我所知

3个单线

  1. a = 10 if <condition>

例:

a = 10 if true # a = 10
b = 10 if false # b = nil
Run Code Online (Sandbox Code Playgroud)
  1. a = 10 unless <condition>

例:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
Run Code Online (Sandbox Code Playgroud)
  1. a = <condition> ? <a> : <b>

例:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.

  • 狗 这是最好的答案——我喜欢它对所有三种方式的简洁对比。谢谢! (2认同)

小智 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"
Run Code Online (Sandbox Code Playgroud)


nit*_*rma 7

if else条件可以用三元运算符覆盖

@item.rigged? ? 'Yes' : 'No'
Run Code Online (Sandbox Code Playgroud)