假设我有一系列我希望执行各种古怪操作的东西。例如:
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
(或类似)并将其传递到块中是否更好?
答案 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