But the way procs and blocks are different is lame:
["a", "b c"].map { |x| CGI.escape(x) } => ["a", "b+c"] # the result i want ["a", "b c"].map(CGI.escape) ArgumentError: wrong number of arguments (0 for 1) p = Proc.new { |x| CGI.escape(x) } ["a", "b c"].map(&p) => ["a", "b+c"] ["a", "b c"].map(&CGI.escape) ArgumentError: wrong number of arguments (0 for 1)
I run into a similar pattern all the time writing Python at work and it's equally lame:
>>> map(upper, ['abc', 'def']) # i know this won't work Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'upper' is not defined >>> map(lambda x: x.upper(), ['abc', 'def']) ['ABC', 'DEF']
So my code ends up littered with more readable but still lame [x.foo() for x in list] over and over.
Perl worked around it with the implicit variable, which makes the language-purity-types shudder but I think is a pretty clever way to design it.
% perl -e '$,=":"; print map { $_ + 1 } (1,2,3)'
2:3:4