Символ для proc для двух элементов, а не один

Я делаю это много:

m51.items.map(&:id)

но хотел бы сделать два элемента для моего символа-к-proc. Какой будет синтаксис? Я пытался

m51.items.map(&[:instore_image_url, :id])

но не работает. Это приложение RoR, поэтому, если рельсы специфические, это нормально

спасибо

2 ответа

сопоставление для proc будет отображаться только на один метод. Вы не можете передать массив. У вас есть несколько вариантов:

Используйте не-proc-версию карты:

m51.items.map {|i| [i.instore_image_url, i.id] }

или создать новый метод для вашего элемента, который возвращает две вещи и вызывает это:

# preferably give it a more meaningful name than this
def url_and_id
 [self.instore_image_url, self.id]
end

m51.items.map(&:url_and_id)


Ну, очевидная причина, почему Symbol#to_proc не работает, заключается в том, что вы пытаетесь преобразовать Array в Proc, а не в Symbol. Итак, вам нужен подходящий Array#to_proc. Что-то вроде этого:

class Array
 def to_proc
 -> el { map(&el.method(:public_send)) }
 end
end

Item = Struct.new(:instore_image_url, :id, :doesnt_matter)

items = [Item.new('foo.jpg', 23, :bla), Item.new('bar.gif', 42, :blub)]

items.map(&[:instore_image_url, :id])
# => [['foo.jpg', 23], ['bar.gif', 42]]

Однако это действительно плохая идея. Это не ясно, что Array#to_proc. Существует несколько реализаций Array#to_proc в дикой природе, но большинство из них интерпретируют &[:one, :two] _.one.two &[:one, :two] как _.one.two, а не [_.one, _.two]. Математически Array изоморфен функции от Integer к элементам, поэтому единственная очевидная реализация, которая имеет смысл, такова:

class Array
 def to_proc
 method(:[]).to_proc
 end
end

[2, 2, -1, 0, 0].map(&[:one, :two, :three])
# => [:three, :three, :three, :one, :one]

licensed under cc by-sa 3.0 with attribution.