在Ruby中链接流函数的最简洁方法是什么?

时间:2017-06-14 09:13:10

标签: 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块,看起来更加狡猾:

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 个答案:

答案 0 :(得分: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