Feature #7998


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

Added by pmarreck (Peter Marreck) over 11 years ago. Updated almost 10 years ago.

Target version:


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.

Updated by Student (Nathan Zook) over 11 years ago


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

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

Updated by trans (Thomas Sawyer) over 11 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()


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

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.

Updated by kernigh (George Koehler) over 11 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.

Updated by hsbt (Hiroshi SHIBATA) almost 10 years ago

  • Status changed from Open to Closed

def method return symbol on Ruby 2.1 or later.


Also available in: Atom PDF