2017-06-14 70 views
4

比方說,我有一堆東西,我想執行各種古怪的操作。例如:在Ruby中鏈接流函數的最簡潔的方法是什麼?

my_array = [ 
    { name: 'Lyra', age: 12 }, 
    { name: 'Harry', age: 11 }, 
    { name: 'Kestrel', age: 13}, 
] 

我想篩選出任何12歲以下,改變所有名的符號,然後按年齡排序他們(說)。

這可以通過以下方式實現:

new_array = my_array. 
    select { |person| person[:age] > 11 }. 
    map { |person| person.merge(name: person[:name].to_sym) }. 
    sort_by { |person| person[:age] } 

所以這就是所有的花花公子。但是如果我有任意複雜的邏輯,我需要做我的選擇/映射/排序/等等。

標準實踐表明,應避免使用帶花括號的多線塊(有些棉絨甚至完全禁止它)。然而,另一種方法是啓動鏈接do..end塊,它看起來甚至ickier:

new_array = my_array. 
    select do |person| 
    # Do something complex 
    end. 
    map do |person| 
    # More complex stuff 
    end. 
    sort_by do |person| 
    # Yet more complex stuff 
    end 

是否Ruby社區有鏈接這樣的事情上最好的做法有什麼建議?例如,定義Proc(或類似的)是否更好,並將其傳遞給塊?

+1

_「是更好的定義PROC(或類似),並傳遞到塊?」 _ - 你不必要手動調用塊內的proc,可以將它傳遞給_塊,例如'filter = - >(p){p [:age]> 11}'並通過'my_array.select(&filter)調用它' – Stefan

+0

我發現你的第一個代碼鏈接在一行塊上,帶有大括號 – Poilon

+1

@Poilon,適用於單線運動員。問題是如何處理更復雜的邏輯,即不適合一條線的邏輯。 – Stefan

回答

4

您可以創建一個副本,並使用破壞性的方法來代替:

new_array = my_array.dup 

new_array.select! do |person| 
    # Do something complex 
end 

new_array.map! do |person| 
    # More complex stuff 
end 

new_array.sort_by! do |person| 
    # Yet more complex stuff 
end 
+1

是的,當然是一個選項,儘管通常我會盡量避免變異對象(儘管顯然這取決於具體的實現細節等等)。 – Alec

+0

@Alec'new_array = my_array.dup'事先創建一個副本。 – Stefan

+0

啊哈錯過了。 – Alec

相關問題