9

我找到了三种在 Ruby 中编写相同条件的方法:

#1
if 1==1 
  puts "true" 
end

#2
puts "true" if 1==1

#3
if 1==1  then puts "true" end

为什么我不能这样做?

#4
if 1==1 puts "true"

我不明白:

  1. 为什么#3 中需要thenend ,并且,
  2. 为什么我需要更改顺序才能让#2 工作。

语句#4 似乎是最自然的写法。我不明白为什么这是不可能的。

4

3 回答 3

19

" if x then y end" 语法用于多行条件语句,而 " y if x" 形式用于简洁的单行条件语句。在第then一种情况下,有必要告诉 Ruby 条件已经结束(因为 Ruby 不需要像 C 那样的括号),并且end有必要告诉 Ruby 整个if块已经结束(因为它可以是多行)。

您可以将 替换then为分号,因为换行符也表示条件结束。end你不能用 multiline摆脱if。如果您想要简洁的单行符,请使用第二种形式或三元运算符。

例如,假设

x = true

以下将评估 true,并返回 y

x ? y :
=> y

同样,这将评估为 false 并且不返回任何内容

!x ? y :
=> 

在“:”之后添加一个术语以表示 else 情况

!x ? y : z
=> z
于 2009-03-10T18:10:57.007 回答
4

问题是这两种方式实际上都是一种自然的思考方式:

如果这是真的,那就做点什么

如果这是真的,做某事

看?Ruby 试图以这种方式接近英语语法。end只是结束块所必需的,而在第二个版本中,块已经用if关闭了。

要真正回答您的问题,我认为没有机会将thenend删除。还记得帕斯卡/德尔福吗?你也有一个then那里。只有 C 风格的语言没有它是典型的。

于 2009-03-10T16:47:32.170 回答
0

那么使用冒号而不是这样呢?http://www.java2s.com/Code/Ruby/Statement/layoutanifstatementisbyreplacingthethenwithacolon.htm

如果您愿意,有多种方法可以短路。

条件语句只是 Ruby 语法的一部分,使其更像英语。

于 2009-03-10T16:52:05.527 回答