Ruby on rails 处理两个项目而不是一个项目的符号

Ruby on rails 处理两个项目而不是一个项目的符号,ruby-on-rails,ruby,Ruby On Rails,Ruby,我经常这样做: m51.items.map(&:id) 但是我想为我的符号做两个元素。语法是什么?我试过了 m51.items.map(&[:instore_image_url, :id]) 但它不起作用。这是一个RoR应用程序,所以如果Rails是特定的,那没关系。映射到proc将只映射到一个方法。你不能给它一个数组。 您有两个选择: 使用map的非proc版本: m51.items.map {|i| [i.instore_image_url, i.id] } 或者在项目

我经常这样做:

m51.items.map(&:id)
但是我想为我的符号做两个元素。语法是什么?我试过了

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

但它不起作用。这是一个RoR应用程序,所以如果Rails是特定的,那没关系。

映射到proc将只映射到一个方法。你不能给它一个数组。 您有两个选择:

使用map的非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
不起作用的明显原因是,您试图将
数组
转换为
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]
解释为
\uone.two
,而不是
[\uone,\uo2]
。从数学上讲,
数组
同构于从
整数
s到元素的函数,因此唯一有意义的明显实现是:

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

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

没办法。你被困在
m51.items.map{| item |[item.instore_image_url,item.id]}
Geez,几乎问了同样的问题,这是通过谷歌搜索lol得出的。使用了回答的第二部分谷歌和堆栈溢出。。。节省全世界程序员的时间;)thx,喜欢数组上的黑客——这是一个不错的面试问题,但对于代码来说却相当不透明。非常有帮助的解释,我希望一切顺利。