Project

General

Profile

Actions

Feature #15897

closed

`it` as a default block parameter

Added by mame (Yusuke Endoh) almost 5 years ago. Updated almost 4 years ago.

Status:
Closed
Target version:
-
[ruby-core:92948]

Description

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.

Examples:

public def it(x = "X")
  x
end

[1, 2, 3].map { it.to_s }    #=> ["1", "2", "3"]
[1, 2, 3].map { self.it }    #=> ["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

Pros:

  • 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

Cons:

  • 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's proposal of @.

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


Files

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 2 (0 open2 closed)

Related to Ruby master - Misc #15723: Reconsider numbered parametersFeedbackmatz (Yukihiro Matsumoto)Actions
Has duplicate Ruby master - Feature #18980: Re-reconsider numbered parameters: `it` as a default block parameterClosedk0kubun (Takashi Kokubun)Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0