2017-07-07 74 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