Feature #7998
closed"def" should return a value (the symbol of the method name) instead of nil
Description
The C code that implements Ruby method definitions already creates a symbol corresponding to the method name.
I propose that the "def... end" block returns this symbol.
This would allow the following elegant Ruby code:
protected def foo(); end
private def bar(); end
since "protected" and "private" already take symbol arguments.
I estimate that this would be extremely easy to implement while creating extremely minimal existing code impact.
I proposed this idea to the #ruby IRC channel on freenode.net and it was received very well, they encouraged me to file this ticket! Thank you for considering.
Updated by Student (Nathan Zook) over 11 years ago
+1
While the proposed usage is good, I immediately thought about this:
new_meth_name = module_eval <<-RUBY
def prefix_#{val}_postfix
...
end
RUBY
Updated by trans (Thomas Sawyer) over 11 years ago
=begin
It has been suggested long long ago. Probably more than once. Here is a link to one: #3753.
Once we start looking at code like that for a while will we then start to think, why not just:
public foo()
...
end
protected foo()
...
end
private bar()
...
end
=end
Updated by gcao (Guoliang Cao) over 11 years ago
This is a nice addition indeed and I remember I asked for it too in the
past. One usage could be method annotation like what is done in some
command line library:
desc 'Do something'
def do_something
...
end
The above code looks nice but I believe its underlying code involves
using method_added and is fragile when method_added is also used for
other functionalities.
If def returns method name, then a comma is all we need to remove the
meta-programming complexity.
desc 'Do something',
def do_something
...
end
I really wish one day this will be added to Ruby.
Updated by kernigh (George Koehler) over 11 years ago
=begin
I have a problem with this feature.
module Frog
private def self.sound
"Ribbit!"
end
end
With this feature, def..end would return :sound, then private :sound would set Frog#sound to private. This is wrong. I defined Frog::sound, not Frog#sound. Surprise! There is no way for private :sound to know that I defined a metamethod, not an instance method; because def..end only returned a Symbol, not the whole definition. With this feature, "private def" only works for instance methods, not for metamethods.
=end
Updated by hsbt (Hiroshi SHIBATA) about 10 years ago
- Status changed from Open to Closed
def method return symbol on Ruby 2.1 or later.