如何在Array中定义方法to_proc,以便我可以在特定情况下使用它

use*_*702 1 ruby overriding proc

让我们说我有班级:

class Car
  attr_accessor :brand, :color
  def initialize(br, col)
    @brand = br
    @color = col 
  end
end

first_car = Car.new 'Mercedes', 'Yellow'
second_car = Car.new 'Jaguar', 'Orange'
third_car = Car.new 'Bentley', 'Pink'

array_of_cars = [first_car, second_car]
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法是to_proc在类Array中定义一个方法,这样就可以实现:

array_of_cars.map(&[:brand, :color]) #=> [['Mercedes', 'Yellow'], ['Jaguar', 'Orange'], ['Bentley', 'Pink']]
Run Code Online (Sandbox Code Playgroud)

或者我怎么能以某种方式做这样的事情:

[:brand, :color].to_proc.call(first_car) #=> ['Mercedes', 'Yellow']
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

标准Symbol#to_proc或多或少是一个e.send(self)调用,你只想要send一个充满符号的数组到每个元素,所以只需用这样的东西说:

class Array
  def to_proc
    proc { |e| self.map { |m| e.send(m) } }
  end
end
Run Code Online (Sandbox Code Playgroud)

我可能不会为此修补数组,如果我想要更容易理解的内容,我只使用本地lambda:

brand_and_color = lambda { |e| [:brand, :color].map { |s| e.send(s) } }
array_of_cars.map(&brand_and_color)
Run Code Online (Sandbox Code Playgroud)