Reputation: 5751
Sorry if this is a stupid question but I'm a C# guy fumbling his way around ruby..
in ruby i notice a lot of people do this:
do_something(with params) if 1 = 1
is there any difference (even slight) between that and this:
if 1 = 1 do_something(with params)
or is it the same thing written for better clarity?
Upvotes: 10
Views: 8513
Reputation: 81671
The following leaves foo
as nil.
foo = true unless defined?(foo) #Leaves foo as nil
This is because Ruby creates a variable foo
and assigns it to nil when it reads (parsing, I think) the foo = true
bit, and then when it reads (executing, I think) the unless defined?(foo)
, it says that foo
is defined (it's defined as nil), and therefore doesn't execute the foo = true
part.
If you did
unless defined?(foo)
foo = true
end
then you'd get foo
assinged to true.
I added this to What are the Ruby Gotchas a newbie should be warned about?, because someone got confused about it here.
So yes, in some circumstances it can matter.
Upvotes: 2
Reputation: 303520
The latter is syntactically invalid. You would need to write:
if 1==1 then do_something(with params) end
Single-line conditionals must always trail. And yes, there is a difference. Try these out:
bar1 = if foo1=14
foo1*3
end
#=> 42
bar2 = foo2*3 if foo2=14
#=> NameError: undefined local variable or method `foo2' for main:Object
In the latter, Ruby sees the assignment after the reference and so treats foo2
as a method instead of a local variable. This is only an issue when:
Upvotes: 7
Reputation: 5767
It's syntactic sugar... allowing us to write code in a way that's easier to read.
http://rubylearning.com/satishtalim/ruby_syntactic_sugar.html
Note: for @Phrogz, the following are NOT the same! Please make sure that you are not trying to assign a value to variable instead of comparing a variable to a value! Also, as Phrogz mentions, the order of variable assignment makes a big difference... see @Phrogz answer for mor details!
if 1 = 1 then do_something(with params) end
if 1 == 1 then do_something(with params) end
Upvotes: 4
Reputation: 31468
Fire up irb
and run your code and you will learn:
if 1==1
, you will have to add a :
or then
and close with an end
.The trailing if
should really only be used for single expressions and you can't add an else
. They are called statement modifiers and they are just syntactic sugar for better readability. I'm not totally against them but recommend using them sparingly.
Upvotes: 4
Reputation: 335
You can use either but if you put the if statement first then you will need to close the condition with an 'end'.
if 1==1
do_something(with params)
end
Upvotes: 2