Project

General

Profile

Feature #10499

Eliminate implicit magic in Proc.new and Kernel#proc

Added by headius (Charles Nutter) almost 3 years ago. Updated almost 3 years ago.

Status:
Open
Priority:
Normal
Target version:
[ruby-core:66225]

Description

Proc.new and Kernel#proc have a little known feature: if called without a block, they capture whatever block was passed to the current method.

I propose that this feature should be removed, finally, since it:

  • Doesn't enhance readability (where is this block coming from?)
  • Doesn't reflect any other behavior in Ruby
  • Can lead to bugs (call either without a block accidentally and you aren't sure what you'll get)

I believe this was an implementation artifact in MRI, since the most recently-pushed block would still be on global stacks, which is where the logic for proc and Proc.new looked for it.

All argument syntaxes now support &block, which I believe is the correct way to clearly, explicitly capture the incoming block into an object.

Thoughts?

History

#1 [ruby-core:66228] Updated by marcandre (Marc-Andre Lafortune) almost 3 years ago

  • Category set to core
  • Assignee set to matz (Yukihiro Matsumoto)

I agree.

Deprecate first (2.2?), remove afterwards.

This would also simplify things if and when we want to warn/raise on unused blocks when calling user methods.

#2 [ruby-core:66748] Updated by headius (Charles Nutter) almost 3 years ago

Adding a deprecation warning would be easy if we can get buy-in from matz.

matz: ball's in your court, I think!

Also available in: Atom PDF