From: Josh Cheek Date: 2011-09-29T09:08:47+09:00 Subject: Re: How about new syntax: "object.\method" returns a Method instance? --0003255580cae795b104ae094f1c Content-Type: text/plain; charset=ISO-8859-1 On Sun, Sep 25, 2011 at 9:40 AM, Joey Zhou 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. --0003255580cae795b104ae094f1c--