2017-07-07 73 views
-3

而不是使用&块调用一个方法,我怎么能说两种方法同时使用`

objects_array.collect(&:errors) 

我可以调用两种方法同时使用&`&?我想要这样的事情:

objects_array.collect(&:errors.full_messages) 

这可能吗?

+2

请注意,您要调用的方法不是同时发生的。 –

+0

几乎所有的事情都可能*在红宝石里,这取决于你想为它工作的难度。 (大多数时候这是不值得的努力) – engineersmnky

+0

感谢所有这些评论。我已经知道它可以使用地图/收集。我只是想知道它是否可能。谢谢。 –

回答

2

无法通过单次传递和简写操作完成此操作。要么两次通过

objects_array.collect(&:errors).collect(&:full_messages) 

或使用完整的形式。

objects_array.collect{ |obj| obj.errors.full_messages } 
+0

虽然它会工作,但不必要的中间阵列和2个循环.. :) –

+0

@ Md.FarhanMemon:是的,这就是我说的:) –

2

能这可能吗?

不,它只是一个速记方法,使用块代替..

objects_array.collect { |obl| obj.errors.full_messages } 
1

如果重新定义Symbol#method_missing存储方法链,也重新定义Symbol#to_proc使用扩展到一个进程有可能存储的方法链。但我相当肯定它会带来更多的复杂性而不是它的帮助,并导致一些严重的问题。这不值得去做。

+1

它只适用于未定义的方法,即'[1,10,100]。 map(&:to_s.length)'会产生一个'TypeError'而不是返回'[1,2,3]',因为Symbol响应'length'。 – Stefan

+1

@Stefan是的,更复杂的'undef_method'和调用'method_missing''原始方法的调度组合应该在这里发生。 – mudasobwa

+0

@Stefan OTOH'Symbol#to_proc'可能会返回一个扩展的'Proc'后代,它返回一个包裹着'TypeError'救助者的proc,而后者又会将调用委托给它们所属的地方。这是行不通的。 – mudasobwa