Hi Everyone,
I have to say I'm utterly fascinated by Ruby and I'm really getting
in to the spirit of it. I've been programming in Smalltalk for about
three years now. Some of the things that initially hit me with Ruby though:
Procs, Blocks - a confusion. It is really nice to be able to throw
around a block to methods and get it's value using yield. But there is a
limitation that to pass more than one block to a method you need to
convert it in to a Proc.
One of the most comment extensions to Smalltalk that you might find is this:
Collection>>detect: detectBlock ifFound: foundBlock ifNone: noneBlock
To write something similar in Ruby as of 1.6.4, you end up writing:
class Array
def found_none(found_proc,none_proc)
return none_proc.call if !(result = detect)
result
end
end
a = [1,2,3,4]
a.found_none (proc {|e| print e}, proc {print 'none'}) {|e| e == 3}
this isn't ideal. In fact, it's disguisting. Especially since you can't
pass your Proc's on as block's to be the next yieldable block. You need
to write a block that evaluates the proc to be your block.
My next thought was with formatting
method parameters # this works
method
parameters # this doesn't
method (
parameters) # this works
method
(parameters) # this doesn't
method {someCode} # this works
method
{someCode} # this doesn't
why am I going on about this?
someCollection found_none
(proc {|e| print e},
proc {print 'none'})
{|e| e == 'testing'}
is much easier to read than:
someCollection found_none (
proc {|e| print e},
proc {print 'none'}) {|e| e == 'testing'}
Am interested to hear peoples opinions on my first experiences with Ruby
Michael Lucas-Smith