Project

General

Profile

Actions

Feature #16273

open

Proposal: Shorthand operator for "#instance_method"

Added by osyo (manga osyo) over 4 years ago. Updated about 4 years ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:95486]

Description

hi, created issues to discuss shorthand for "#instance_method"

Overview

Ruby 2.7 adds a #method shorthand .: operator.

In this issues want to discuss the shorthand operator for "#instance_method".

Background

If you want to pass an array to Array#zip or Hash#merge as shown below, the code will be messy.

arrays = [["a", "b"], ["c"], ["d", "e"]]
hashs  = [{"a" => 1}, {"b" => 2, "c" => 3}, {"d" => 4, "e" => 5}]

# `#first` must be a receiver and the value excluding `#first` must be passed as an argument
arrays.first.zip(*arrays.drop(1))
arrays.first.product(*arrays.drop(1))
hashs.first.merge(*hashs.drop(1))

This can be solved by using # bind_call ([# 15955] (https://bugs.ruby-lang.org/issues/15955)).

arrays = [["a", "b"], ["c"], ["d", "e"]]
hashs  = [{"a" => 1}, {"b" => 2, "c" => 3}, {"d" => 4, "e" => 5}]

Array.instance_method(:zip).bind_call(*arrays)
Array.instance_method(:product).bind_call(*arrays)
Hash.instance_method(:merge).bind_call(*hashs)

But #instance_method is long.
I'm thinking shorthand operator for #instance_method.

:MEMO: There was a suggestion to add Array.zip or Array.product in the past

Proposal new operator

I can't come up with a suitable operator yet, sorry...
However, considering the .: operator, I think "operator + Symbol (:)" is good.

# Document-like writing
# `#` + operator
Array#zip
Array.#zip
Array#:zip

# Constant-link writing
# :: + :hoge
Array:::zip
Array::#zip

Also, the following syntax is valid at this time, so it may be difficult to adopt.

Array!zip
Array@zip
Array&zip
Array:zip

Please comment if you are interested in the shorthand operator for # instance_method.

  • Other #instance_method usecase
  • Proposal shorthand operator
  • etc...

Thank you! :)

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0