On Sun, Sep 25, 2011 at 9:40 AM, Joey Zhou <yimutang / gmail.com> wrote:

> I'm afraid the normal way of creating a Method instance is circuitous
> and a bit hard to write:
>
>    a_method = object.method(:method_name)
>
> I find the way of obtaining a function/method object in Python is so
> easy, for example, "str.split()" returns a list, while "str.split"
> (without parentheses) returns a method object. However, parenthesis in
> Ruby is always optional, so this road is blocked.
>
> Well, how about "object.\method" style? You can type "str.\split" to get
> "str.method(:split)".
>
> The reasons are:
>
> 1. It makes people happy, writing less code, and no harm to readability.
>
> 2. "\" is not a frequently used token. It can only be used in strings,
> regexps (or any else?). I think using this token leads to no ambiguity.
>
> 3. "\" is like Perl's referrence symbol. In Perl, you can use "$f =
> \&func;" to make a referrence to the function. In Ruby, "&" seems
> unnecessary.
>
> 4. It enhances the consistency of the language syntax. There are two
> correlative methods "Object#send" and "Object#method", but...
>
>    str.send(:split)   == str.split
>    str.method(:split) ==  ???????
>
> If adding this new syntax, it looks more pretty:
>
>    str.method(:split) == str.\split
>
> --
> Posted via http://www.ruby-forum.com/.
>
>
While I'm not sure how I feel about this particular syntax, I think that
better support for getting methods would have some fairly profound changes
to Ruby code. Right now we think this isn't really worth it, because we
don't really do things like this, because the syntax is awkward. But if it
were easier, I think we'd see a lot more of it.

An example from yesterday, I wrote `File.open csv_name,
&MembersFromCSV.method(:populate)`

And I honestly almost took it out (and still might), because even though I
think this is the right way to do it, it's cumbersome and you kind of have
tolook at it and think about things for a while. The equivalent is
`File.open(csv_name) { |file| MembersFromCSV.populate file }` but it's kind
of obnoxious that you have to create a superfluous block that does nothing
but forward its arguments to the real target when you could pass the real
target instead of the block if there were a bit better support for this sort
of thing.