Опять же, вы можете построить его. Это не так элегантно, но ...
class Call
def self.[](name, *args)
self.new(name, *args)
end
def initialize(name, *args)
@proc = Proc.new do |obj|
obj.send(name, *args)
end
end
def to_proc
@proc
end
end
fourth = Call.new(:[], 3)
[[1,2,3,4,5],[6,7,8,9,10]].map(&fourth) # => [4, 9]
# or equivalently
[[1,2,3,4,5],[6,7,8,9,10]].map(&Call.new(:[], 3)) # => [4, 9]
[[1,2,3,4,5],[6,7,8,9,10]].map(&Call[:[], 3]) # => [4, 9]
Если вы хотите специализировать его для индексов, вы можете даже упростить до этого:
class Index
def self.[](*args)
self.new(*args)
end
def initialize(*args)
@proc = Proc.new do |obj|
obj[*args]
end
end
def to_proc
@proc
end
end
[[1,2,3,4,5],[6,7,8,9,10]].map(&Index[3]) # => [4, 9]
Или, намного короче, как продемонстрировал @muistooshort в комментариях, если вы не хотите иметь полный класс, посвященный этому:
index = ->(*ns) { ->(a) { a[*ns] } }
[[1,2,3,4,5],[6,7,8,9,10]].map(&index[3]) # => [4, 9]