[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

if behavior

Qwe Qwe

4/19/2008 11:58:00 AM

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
[/code]
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.
--
Posted via http://www.ruby-....

7 Answers

Stefano Crocco

4/19/2008 12:11:00 PM

0

On Saturday 19 April 2008, Qwe Qwe wrote:
> 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
> [/code]
> 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



Florian Gilcher

4/19/2008 12:11:00 PM

0

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


On Apr 19, 2008, at 1:57 PM, Qwe Qwe wrote:

> 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
> [/code]
> 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.
> --
> Posted via http://www.ruby-....
>

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-----

Qwe Qwe

4/19/2008 12:14:00 PM

0

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?
--
Posted via http://www.ruby-....

Arlen Cuss

4/19/2008 12:18:00 PM

0

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

Hi,

On Sat, Apr 19, 2008 at 10:14 PM, Qwe Qwe <frea@email.com> wrote:

> 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

Stefano Crocco

4/19/2008 12:19:00 PM

0

On Saturday 19 April 2008, Florian Gilcher wrote:
> 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





David A. Black

4/19/2008 1:36:00 PM

0

Hi --

On Sat, 19 Apr 2008, Qwe Qwe wrote:

> 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.r... for details and updates!

Christopher Dicely

4/19/2008 7:48:00 PM

0

On Sat, Apr 19, 2008 at 5:14 AM, Qwe Qwe <frea@email.com> wrote:
> 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_expres...