2012-02-27 55 views

回答

73

&符號用於表示以下參數應視爲給予該方法的塊。這意味着如果它不是一個Proc對象,它的to_proc方法將被調用以將其轉換爲一個。

因此,在一些你的榜樣結果像

Post.all.map(&:id.to_proc) 

這又相當於

Post.all.map { |x| x.id } 

所以它遍歷由Post.all返回的集合,並構建了結果數組每個項目都調用id方法。

這是可行的,因爲Symbol#to_proc創建了一個Proc,它接受一個對象並用該對象的名稱調用該方法。它主要用於方便,以節省一些打字。

+5

這是不正確的。 map(:id.to_proc)會拋出一個ArgumentError,因爲map不接受任何參數。將Proc作爲參數傳遞給**不是和提供塊相同。 '&'做的是將Proc變成塊,如果操作數不是Proc,它首先調用to_proc,然後將結果變成塊。 – sepp2k 2012-02-27 16:43:57

+0

@ sepp2k:是的,我忘記了一個'&'。 – 2012-02-27 16:44:43

+0

你的第一句話還應該讀一些像''&x'與'&x.to_proc''一樣的東西 - 除了定義是無限遞歸的。 – sepp2k 2012-02-27 16:46:53

1

這需要所有Post對象並創建一個數組,其中每個對象都調用id方法。

換句話說,對於ActiveRecord,這意味着您將獲得數組中的所有Post實體的id屬性。