用于处理两个而不是一个的符号

时间:2014-08-22 01:41:44

标签: ruby-on-rails ruby

我做了很多:

m51.items.map(&:id)

但是想为我的符号到proc做两个元素。语法是什么?我试过了

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

但没有工作。这是一个RoR应用程序,所以如果特定于rails,那就好了

THX

2 个答案:

答案 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]。从数学上讲,ArrayInteger 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]