if behavior

Q

Qwe Qwe

Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
Code:
if session[:login]
10/0
else
11/0
end if
doesn't inform me about division by zero. Actually it seems that none of
paths is evaluated. I don't get it. I've checked few tutorials, none of
the said anything about possibility of such behavior.
 
S

Stefano Crocco

Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
Code:
if session[:login]
10/0
else
11/0
end if
doesn't inform me about division by zero. Actually it seems that none of
paths is evaluated. I don't get it. I've checked few tutorials, none of
the said anything about possibility of such behavior.

I think the problem is the if at the end of the last line. In ruby, the if-
then-else statement is closed by end, not end if. So, ruby thinks that the if
after the end is the beginning of a if modifier statement, that is, of
something like

puts "greater" if x > 5

Since the if modifier requires some condition after the if keyword, ruby will
look for it in the next line and interpret what you wrote like this:

(
if session[:login]
10 / 0
else
11 / 0
end
) if ... #whatever is in next line

This means that if the expression which gets interpreted as the condition for
the if modifier (that is, the second if) is false or nil, all the first if
statement won't be executed.

I hope this helps

Stefano
 
F

Florian Gilcher

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


Hi,
i recently started to learn ruby as well as rails and came across a
problem.
such code:
Code:
if session[:login]
10/0
else
11/0
end if
doesn't inform me about division by zero. Actually it seems that
none of
paths is evaluated. I don't get it. I've checked few tutorials, none
of
the said anything about possibility of such behavior.

Yes, because the code never gets evaluated. if-blocks are ended by
"end" and not "end if". What you wrote can be interpreted as:

====
(if session[:login]
10/0
else
11/0
end) if
====

So: execute the if statement, if.... As there is no second condition
on the second if, it is always false. So the code inside the
paranthesis will never get executed.

This is happening because ruby allows you to write a condition after a
statement, e.g.:

====
do_weird_things if (true == ruby.is_driving_crazy?(you))
====

Regards,
Florian Gilcher
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)

iEYEARECAAYFAkgJ4UsACgkQJA/zY0IIRZZzfQCgl55ikkAE3ysW88WM0w1Qf5TD
zrcAnR+hGkdRXkQrLFbUqXLeNofIJtiD
=ROnh
-----END PGP SIGNATURE-----
 
Q

Qwe Qwe

ehm great

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
1
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end

works, but commenting out 1

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end

makes the if not evaluated.

why?
 
A

Arlen Cuss

[Note: parts of this message were removed to make it a legal post.]

Hi,

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
1
respond_to do |format|
format.html # index.html.erb
...


See Florian's message.
Replace "end if" with "end" only -- it's modifying the entire previous
conditional to only happen if the bit that follows returns true (or a truthy
value).

HTH,
Arlen
 
S

Stefano Crocco

As there is no second condition
on the second if, it is always false.

I don't think so. Without a condition after the if, you'll get a SyntaxError.
At least, that's what my tests show. Try running this:

ruby -e ' if true; puts "TRUE"; end if'

As I explained in my other post, since ruby doesn't find a condition on the
same line of the if, it'll go on looking for it in the following line.

Stefano
 
D

David A. Black

Hi --

ehm great

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
1
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end

works, but commenting out 1

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end

makes the if not evaluated.

why?

$ ruby -e 'if true then p 1 else p 2 end if false'
$ ruby -e 'if true then p 1 else p 2 end if true'
1

The "if false" and "if true" at the end govern the whole thing. In
your first example, you're doing:

if true then @users = ... else @users = ... end if 1

Since 1 is true, it gets executed.

In your second example, you're doing:

if true then @users = ... else @users = ... end if respond_to...

I imagine respond_to must return nil. Therefore, you're telling the
first if statement not to execute.

This "if <condition> end if <other_condition>" idiom is extremely
unusual and almost certainly not what you intend to do. As others have
said, it looks like you just want an if block, which ends with end.


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 
C

Christopher Dicely

ehm great

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
1
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end

works, but commenting out 1

if true then
@users = User.find( :all )
else
@users = User.find( :all )
end if
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end

makes the if not evaluated.

why?

see "If and unless modifiers", on this page:
http://www.rubycentral.com/pickaxe/tut_expressions.html
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,291
Messages
2,571,455
Members
48,132
Latest member
KatlynC08

Latest Threads

Top