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?
class TheClass
def self.TheMethod()
if block_given?
puts “yes, block given”
else
puts “no block is given”
end
‘return val’
end
end
ok
puts TheClass.TheMethod {|param| 123}
block not detected
puts TheClass.TheMethod do |param|
123
end
ok
a = TheClass.TheMethod {|param| 123}
puts a
ok
a = TheClass.TheMethod do |param|
123
end
puts a
On 7/20/07, [email protected] [email protected] wrote:
else
puts TheClass.TheMethod do |param|
end
puts a
puts( TheClass.TheMethod do nil end )
do…end and {} do not have the same precedence, thus, without the ()
you are doing this
puts( TheClass.TheMethod ) do nil end
HTH
Robert
On 20 Juli, 14:04, “Robert D.” [email protected] wrote:
def self.TheMethod()
puts TheClass.TheMethod {|param| 123}
ok
HTH
Robert
–
I always knew that one day Smalltalk would replace Java.
I just didn’t know it would be called Ruby
– Kent Beck- Dölj citerad text -
Thanks
On 2007-07-20 20:19:58 +0900 (Fri, Jul), [email protected] wrote:
else
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 = TheClass.TheMethod {|param| 123}
puts a
ok
a = TheClass.TheMethod do |param|
123
end
puts a
There you have no ambiguity as there is only one method call.
On 7/20/07, Robert D. [email protected] wrote:
do…end and {} do not have the same precedence, thus, without the ()
you are doing this
puts( TheClass.TheMethod ) do nil end
do…end vs {}
and vs. &&
or vs. ||
not vs !
I think that it can be said that generally in ruby “symbols bind
tighter than words”
–
Rick DeNatale
My blog on Ruby
http://talklikeaduck.denhaven2.com/