2015-10-12 67 views
1

如果我們在一個集合上使用另一個方法在每個元素上執行的方法,我們可以使用&符號將它縮短。例如:如果我們有一個整數數組,我們要刪除的奇數我們可以這樣做:爲&符號賦予參數

[1,2,3,4,5,6,7,8].reject {|x| x.odd?} 

使用符號,我們可以這樣寫:

[1,2,3,4,5,6,7,8].reject(&:odd?) 

比方說,我們有一個字符串數組,我們想要刪除包含'a'的元素。我們可以寫這樣的解決方案:

['abc','cba','cbc','cdc','dca','cad','dc','cc].reject {|x| x.include? 'a'} 

此使用&語法(如果可能的話)我們如何寫?

+2

雖然我已經看到了一些非常簡潔的黑客入侵這個概念,但這並不是完全可能的。[Like this SO Answer](http://stackoverflow.com/a/23711606/1978251)你在說什麼叫做'Symbol #to_proc'和搜索到'Symbol to_proc'的參數將提供一些見解,但是現成的答案是你不知道的。 – engineersmnky

+1

[大討論](https://bugs.ruby-lang.org/issues/9076)關於ruby-lang.org中另一個類似的鏈接概念。雖然我不同意以ruby進一步污染&符號('&')的前提,但交談具有一些優點,並使得閱讀起來很刺激。我對任何這些概念的主要關注點是,你越是採用語法糖,代碼變得越不可讀,我最喜歡的關於ruby的部分之一是它強調了人類可讀的代碼。 – engineersmnky

+0

您的「解決方案」無效。 – sawa

回答

1

你不能,這是不可能的。

&後面跟一個符號是一個不帶任何參數的方法的快捷方式。

正如你所說,

.reject(&:odd?) 

是一個快捷方式:

.reject {|x| x.odd?} 

基本上,&:SYMBOL總是傳遞塊的快捷{|x| x.SYMBOL}

這部作品的原因是因爲調用符號上的#to_proc方法返回一個lambda表達式,該表達式是單參數lambda,它調用方法的名稱與其上的符號相同gument。

&將lambda轉換爲塊參數 - 但除此之外,在將其轉換爲塊參數之前,將在其操作數上調用to_proc。所以它在符號上調用to_proc,然後從符號中獲得一個lambda。然後將其作爲塊參數傳遞給您的方法。

當你需要一個塊的主體超出了一個參數塊,它只是調用以它的參數上的一個符號命名的方法時,沒有辦法使用該快捷方式。

只要寫出來就像你一樣。 .reject {|x| x.include? 'a'}沒有什麼不對,只寫那個。