如果条件语句出现在表达式之前或之后,这是否重要?

时间:2010-12-21 14:51:14

标签: ruby syntax if-statement conditional

很抱歉,如果这是一个愚蠢的问题,但我是一个在红宝石上摸索的C#家伙..

在红宝石中,我注意到很多人这样做:

do_something(with params) if 1 = 1

与此之间有什么不同(甚至是轻微的):

if 1 = 1 do_something(with params)

还是为了更清晰而写的是同一件事?

5 个答案:

答案 0 :(得分:6)

后者在语法上无效。你需要写:

if 1==1 then do_something(with params) end

单线条件必须始终跟踪。并且是的,存在差异。试试这些:

bar1 = if foo1=14
  foo1*3
end
#=> 42

bar2 = foo2*3 if foo2=14
#=> NameError: undefined local variable or method `foo2' for main:Object

在后者中,Ruby在引用之后看到赋值,因此将foo2视为方法而不是局部变量。这只是一个问题:

  • 您有意在条件中使用赋值(不测试相等),
  • 这是第一次(就源顺序而言)已在范围内分配此变量。

答案 1 :(得分:4)

启动irb并运行您的代码,您将学习:

  • 1 = 1是语法错误,更改为1 == 1.
  • if 1==1后您无法直接使用表达式,您必须添加:then并使用end关闭。

尾随if实际上只应用于单个表达式,而您无法添加else。它们被称为语句修饰符,它们只是语法糖,以提高可读性。我不是完全反对他们,但建议谨慎使用它们。

答案 2 :(得分:2)

这是语法糖......允许我们以更容易阅读的方式编写代码。

http://rubylearning.com/satishtalim/ruby_syntactic_sugar.html

注意:对于@Phrogz,以下内容不一样! 请确保您没有尝试为变量赋值而不是将变量与值进行比较!另外,正如Phrogz所提到的,变量赋值的顺序有很大的不同......请参阅@Phrogz回答mor的详细信息!

if 1 = 1 then do_something(with params) end
if 1 == 1 then do_something(with params) end

答案 3 :(得分:2)

您可以使用其中任何一种,但如果先将if语句放入,则需要使用'end'关闭条件。

if 1==1 
   do_something(with params)
end

答案 4 :(得分:0)

以下内容foo为零。

foo = true unless defined?(foo) #Leaves foo as nil

这是因为Ruby创建了一个变量foo并在读取(我认为)解析foo = true位时将其分配给nil,然后当它读取(执行,我认为)时{ {1}},它表示unless defined?(foo)已定义(定义为nil),因此不会执行foo部分。

如果你做了

foo = true

然后你会unless defined?(foo) foo = true end 得到真的。

我将此添加到What are the Ruby Gotchas a newbie should be warned about?,因为有人对此感到困惑here

所以是的,在某些情况下它可能很重要。