[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Closures syntax ?

Pedro Del Gallego

2/15/2007 11:52:00 AM

Hi, im new to ruby. I ve qaquestions about closures

1) if i defiene this


def loopN n, &b
i=0
while (i<n) do
b.call
i+=1
end
end

Why the first and the second calls dosnt works and the third works?
1.1) loopN 5, {puts "hola"} # compile error , parse error unexpected
"{", expected "$"
1.2) loopN 5 {puts "hola"} # compile error , unexpected tString.
1.2) loopN (5) {puts "hola"} # works

thanks
--
-------------------------------------
Pedro Del Gallego

Email : pedro.delgallego@gmail.com

2 Answers

Bertram Scharpf

2/15/2007 12:21:00 PM

0


Hi,
Am Donnerstag, 15. Feb 2007, 20:52:08 +0900 schrieb Pedro Del Gallego:
> Why the first and the second calls dosnt works and the third works?
> 1.1) loopN 5, {puts "hola"} # compile error , parse error unexpected
> "{", expected "$"
> 1.2) loopN 5 {puts "hola"} # compile error , unexpected tString.
> 1.2) loopN (5) {puts "hola"} # works

Precedence. "do .. end" has low precedence, applies to the leftmost
function name, "{ ..}" has high.

loopN 5 do puts "hola" end # should work

Bertram


--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-...

Gary Wright

2/15/2007 2:50:00 PM

0


On Feb 15, 2007, at 6:52 AM, Pedro Del Gallego wrote:
> Why the first and the second calls dosnt works and the third works?
> 1.1) loopN 5, {puts "hola"} # compile error , parse error unexpected
> "{", expected "$"

Ruby doesn't expect a comma between the last standard argument and
the optional block argument. Drop the comma.

> 1.2) loopN 5 {puts "hola"} # compile error , unexpected tString.

The {} of the block is binding to the number 5, which is a syntax error.
You need to add parens to clarify your intent as in:

> 1.2) loopN (5) {puts "hola"} # works

This would be more commonly written as:

loopN(5) { puts "hola"}

Alternatively you can use do/end, which has low precedence

loopN 5 do
puts "hola"
end


Gary Wright