Feature #15483
closedProc or Method combination with Symbol
Description
In [Feature #6284], Matz said
We need more discussion if we would add combination methods to the Symbol class.
Right, let's get started to discuss.
For your information, recent a few months I'm discussing this with @osyo (manga osyo) .
This is a discussion of "design"¶
I understand that all features of this issue have both merits and demerits, but I guess that language design is most important. All features of this issue related to each other.
Abstract¶
At present, you can use Proc#>>
or Proc#<<
with Symbol#to_proc
.
%w{72 101 108 108 111}.map(&(:to_i.to_proc >> :chr.to_proc))
# => ["H", "e", "l", "l", "o"]
This is convenient but methods that take block can take a proc with &
syntax sugar instead of #to_proc
by right, like [1, 2, 3].map(&:to_s)
. So Symbol#to_proc
looks like too long for Proc#>>
or Proc#<<
. Therefore, you need new syntax sugar.
Receiver¶
Symbol#>>
and Symbol#<<
Symbol#>>
and Symbol#<<
will be considered, but this means that Symbol
is treated as Proc
partially. The [1, 2, 3].map(&:to_s)
treats Symbol
as Proc
partially too, but it's with pre-positioned &
.
%w{72 101 108 108 111}.map(&(:to_i >> :chr.to_proc))
# => ["H", "e", "l", "l", "o"]
I can't come up with other ideas for the Symbol
receiver.
New &:symbol_name
syntax sugar for :symbol_name.to_proc
%w{72 101 108 108 111}.map(&(&:to_i >> :chr.to_proc)))
# => ["H", "e", "l", "l", "o"]
Argument¶
Calls #to_proc
by Proc#>>
or Proc#<<
internally as a duck typing¶
%w{72 101 108 108 111}.map(&(:to_i.to_proc >> :chr))
# => ["H", "e", "l", "l", "o"]
In this case, Proc#>>
(:to_i.to_proc >>
) calls Symbol#to_proc
(for :chr
) inside.
This is useful to use with Hash#to_proc
:
h = { Alice: 30, Bob: 60, Cris: 90 }
%w{Alice Bob Cris}.map(&(:to_sym.to_proc >> h))
# => [30, 60, 90]
Proc#>>
and Proc#<<
take block as an argument
%w{72 101 108 108 111}.map(&(:to_i.to_proc >> &:chr))
Combination of receiver and argument¶
Symbol#>>
and calling #to_proc
internally:
%w{72 101 108 108 111}.map(&(:to_i >> :chr))
# => ["H", "e", "l", "l", "o"]
&:symbol_name
syntax sugar for :symbol_name.to_proc
and Symbol#>>
and taking block:
%w{72 101 108 108 111}.map(&(&:to_i >> &:chr))
# => ["H", "e", "l", "l", "o"]