很抱歉,如果这是一个愚蠢的问题,但我是一个在红宝石上摸索的C#家伙..
在红宝石中,我注意到很多人这样做:do_something(with params) if 1 = 1
与此之间有什么不同(甚至是轻微的):
if 1 = 1 do_something(with params)
还是为了更清晰而写的是同一件事?
答案 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
并运行您的代码,您将学习:
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。
所以是的,在某些情况下它可能很重要。