From: "Mariusz Pękala" Date: 2007-07-20T21:46:24+09:00 Subject: Re: block_given? problem --QKdGvSO+nmPlgiQ/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2007-07-20 20:19:58 +0900 (Fri, Jul), westlin9@gmail.com wrote: > I can't figure out why the do...end block isn't detected by the > "block_given?" function. The problem occurs when a method call with a > block is used in a puts statement. See the code example below. > Can some one explain this to me please? Is this a bug? >=20 >=20 > class TheClass > def self.TheMethod() > if block_given? > puts "yes, block given" > else > puts "no block is given" > end > 'return val' > end > end >=20 > # ok > puts TheClass.TheMethod {|param| 123} >=20 > # block not detected > puts TheClass.TheMethod do |param| > 123 > end This is because do..end block gets attached to the 'puts' instead of TheMethod. do..end and {||..} differ in precedence. {||..} binds to the rightmost method, while do..end to the leftmost one. > # ok > a =3D TheClass.TheMethod {|param| 123} > puts a >=20 > # ok > a =3D TheClass.TheMethod do |param| > 123 > end > puts a There you have no ambiguity as there is only one method call. --=20 No virus found in this outgoing message. Checked by 'grep -i virus $MESSAGE' Trust me. --QKdGvSO+nmPlgiQ/ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7-ecc0.1.6 (GNU/Linux) iD8DBQFGoK6CsnU0scoWZKARAjRyAJ0X/iohGUZnNllIT/dVcyMH3R6IqgCgwt61 Nnc26RoAjeGPvwzUX3whblI= =V0YH -----END PGP SIGNATURE----- --QKdGvSO+nmPlgiQ/--