Hanmac (Hans Mackowiak) wrote:
i did something similar to that there:
https://bugs.ruby-lang.org/issues/9076#note-9
Hans, your proposal does not look good to me. IMO, it is strange to make
symbols callable and it is strange to add to the responsibilities of
Symbol
to maintain some SymbolHelper
, which looks to me more like a
ProcBuilder
. Also, using method_missing
is always a bit scary to me.
You seem to propose, instead of
[1, 10, 100].map{|x| x.to_s.length.to_f } # => [1.0, 2.0, 3.0]
to write
[1, 10, 100].map &:to_s.call.length.to_f # => [1.0, 2.0, 3.0]
At least i would have called this method #to_symbol_helper
instead of
#call
.
As #method_missing
will not catch calls of #to_proc
, there will be
inevitably exceptions to the general rule:
[1, 2, 3].map{|i| i.method(:**).to_proc.call(2) } # => [1, 4, 9]
[1, 2, 3].map &:method.(:**).to_proc.call(2) # => [2, 4, 8]
If i did not care about such ambiguities, i might have proposed something like this:
class ProcFromCallsBuilder < BasicObject
ThisClass = ::Module.nesting.first
def initialize(&block)
@proc = block || ::Proc.new{|x| x }
end
def call(*a, &b)
@proc[*a, &b]
end
alias [] call
def to_proc
@proc
end
def method_missing(m, *args, &block)
ThisClass.new do |x|
@proc[x].public_send(m, *args, &block)
end
end
end