Feature #7998

"def" should return a value (the symbol of the method name) instead of nil

Added by Peter Marreck almost 3 years ago. Updated over 1 year ago.



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 and it was received very well, they encouraged me to file this ticket! Thank you for considering.


#1 [ruby-core:53117] Updated by Nathan Zook almost 3 years ago


While the proposed usage is good, I immediately thought about this:

new_meth_name = module_eval <<-RUBY
def prefix_#{val}_postfix

#2 [ruby-core:53118] Updated by Thomas Sawyer almost 3 years ago

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()

protected foo()

private bar()


#3 [ruby-core:53252] Updated by Guoliang Cao almost 3 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

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

I really wish one day this will be added to Ruby.

#4 [ruby-core:53351] Updated by George Koehler almost 3 years ago

I have a problem with this feature.

module Frog
private def self.sound

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.

#5 [ruby-core:64378] Updated by Hiroshi SHIBATA over 1 year ago

  • Status changed from Open to Closed

def method return symbol on Ruby 2.1 or later.

Also available in: Atom PDF