Feature #10499

Eliminate implicit magic in and Kernel#proc

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

Target version:

Description 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 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.


Related issues

Copied to Ruby master - Feature #15554: warn/error passing a block to a method which never use a blockOpenmatz (Yukihiro Matsumoto)Actions

Updated by marcandre (Marc-Andre Lafortune) almost 6 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.

Updated by headius (Charles Nutter) almost 6 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!


Updated by k0kubun (Takashi Kokubun) over 1 year ago

  • Copied to Feature #15554: warn/error passing a block to a method which never use a block added

Also available in: Atom PDF