ruby on rails使用&阻止sytax:

所以说我有一个问题模型和一个答案模型和问题has_many答案(这是一个多项选择题)。

假设问题是Question对象的集合。

为了收集所有答案,我可以这样做:

questions.collect(&:answers) 

两个问题:

  1. 这种语法到底意味着什么? 是否扩展到

     questions.collect { |q| q.answers } 

    或者还有其他什么东西在这里?

  2. 有办法吗?

     questions.collect { |q| q.answers.shuffle } 

    使用相同的语法?

     collect(&:answers.shuffle) 

    没有这样做。

我似乎无法在网上的ruby块教程中找到这个并且搜索它不起作用(搜索引擎忽略“&:”)。 我在一些inheritance的代码中找到了它。

谢谢

是的,第一个问题是N重复,但关于第二个问题:不,你不能链方法。 然而 ,没有什么能阻止你 – 除了编写可能困扰人们的代码 – 创建自己的工具:

 class Symbol def to_proc proc do |obj| self.to_s.split(/\./).inject(obj, :send) end end end p ["1", "2", "3"].map(&:"to_i.succ") # [2, 3, 4] 

你甚至可以找到发送参数的方法,尽管它可能不是很漂亮。

您可以选择其中之一

 questions.collect { |q| q.answers.shuffle } 

和来自@tokland的人。 您的代码将为您和其他开发人员提供代码可读性,而toklands解决方案将为您提供方便的访问。 如果您经常使用此模式,则覆盖to_proc方法。 否则使用艰难的方式,不要与大自然玩耍。