ruby on rails使用&阻止sytax:
所以说我有一个问题模型和一个答案模型和问题has_many答案(这是一个多项选择题)。
假设问题是Question对象的集合。
为了收集所有答案,我可以这样做:
questions.collect(&:answers)
两个问题:
-
这种语法到底意味着什么? 是否扩展到
questions.collect { |q| q.answers }
或者还有其他什么东西在这里?
-
有办法吗?
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方法。 否则使用艰难的方式,不要与大自然玩耍。