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

对不起,如果这是一个愚蠢的问题,但我是一个C#家伙摸索着ruby的方式..

在ruby中,我注意到很多人这样做:

do_something(with params) if 1 = 1 

这和之间有什么区别(甚至是轻微的):

 if 1 = 1 do_something(with params) 

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

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

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 

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

 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视为方法而不是局部变量。 这只是一个问题:

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

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

  • 1 = 1是语法错误,更改为1 == 1。
  • if 1==1 ,则不能直接使用表达式,您必须添加:或者thenend关闭。

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

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

 if 1==1 do_something(with params) end 

以下留下foo为零。

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

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

如果你这样做了

 unless defined?(foo) foo = true end 

然后你会得到真实的foo

我把这个添加到了什么是Ruby Gotchas应该警告新手? ,因为有人在这里感到困惑。

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