我做了很多:
m51.items.map(&:id)
但是想为我的符号到proc做两个元素。语法是什么?我试过了
m51.items.map(&[:instore_image_url, :id])
但没有工作。这是一个RoR应用程序,所以如果特定于rails,那就好了
THX
答案 0 :(得分:1)
映射到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)
答案 1 :(得分:1)
嗯,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]
。从数学上讲,Array
与Integer
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]