Project

General

Profile

Actions

Feature #7998

closed

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

Added by pmarreck (Peter Marreck) about 11 years ago. Updated over 9 years ago.

Status:
Closed
Assignee:
-
Target version:
[ruby-core:53086]

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) about 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) about 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) about 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) about 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) over 9 years ago

  • Status changed from Open to Closed

def method return symbol on Ruby 2.1 or later.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0