Feature #15897

`it` as a default block parameter

Added by mame (Yusuke Endoh) over 1 year ago. Updated 6 months ago.

Target version:


How about considering "it" as a keyword for the block parameter only if it is the form of a local varaible reference and if there is no variable named "it"?

[1, 2, 3].map { it.to_s } #=> ["1", "2", "3"]

If you are familiar with Ruby's parser, this explanation is more useful: NODE_VCALL to "it" is considered as a keyword.


public def it(x = "X")

[1, 2, 3].map { it.to_s }    #=> ["1", "2", "3"]
[1, 2, 3].map { }    #=> ["X", "X", "X"] # a method call because of a receiver
[1, 2, 3].map { it() }       #=> ["X", "X", "X"] # a method call because of parentheses
[1, 2, 3].map { it "Y" }     #=> ["Y", "Y", "Y"] # a method call because of an argument
[1, 2, 3].map { it="Y"; it } #=> ["Y", "Y", "Y"] # there is a variable named "it" in this scope

it = "Z"
[1, 2, 3].map { it.to_s }    #=> ["Z", "Z", "Z"] # there is a variable named "it" in this scope


  • it is the best word for the feature (according to matsuda (Akira Matsuda))
  • it is reasonably compatible; RSpec won't break because their "it" requires an argument


  • it actually brings incompatibility in some cases
  • it is somewhat fragile; "it" may refer a wrong variable
  • it makes the language semantics dirty

Fortunately, it is easy to fix the incompatible programs: just replace it with it(). (Off topic: it is similar to super().)
Just inserting an assignment to a variable "it" may affect another code. This is a bad news, but, IMO, a variable named "it" is not so often used. If this proposal is accepted, I guess people will gradually avoid the variable name "it" (like "p").
The dirtiness is the most serious problem for me. Thus, I don't like my own proposal so much, honestly. But it would be much better than Perlish @1. (Note: I don't propose the removal of @1 in this ticket. It is another topic.) In any way, I'd like to hear your opinions.

An experimental patch is attached. The idea is inspired by jeremyevans0 (Jeremy Evans)'s proposal of @.

P.S. It would be easy to use _ instead of it. I'm unsure which is preferable.


its.patch (4.92 KB) its.patch mame (Yusuke Endoh), 06/04/2019 05:07 AM
mame_its_proposal.patch (5.26 KB) mame_its_proposal.patch Benoit_Tigeot (Benoit Tigeot), 07/02/2019 11:45 AM

Related issues

Related to Ruby master - Misc #15723: Reconsider numbered parametersFeedbackmatz (Yukihiro Matsumoto)Actions

Also available in: Atom PDF