2017-06-14 67 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

相关问题