【发布时间】:2017-06-13 15:31:23
【问题描述】:
我试图了解使用map 的语义正确方法。由于map 的行为方式与each 相同,因此您可以随意修改数组。但是我的同事告诉我,在应用map 之后,数组应该有
相同的顺序和相同的尺寸。
例如,这意味着使用映射返回更新的数组将不是使用map 的正确方法:
array = [1,2,3,4]
array.map{|num| num unless num == 2 || num == 4}.compact
多年来,我一直在使用map 和其他Enumerator 方法,从未考虑过太多。非常感谢经验丰富的 Ruby 开发人员的建议。
【问题讨论】:
-
那太好了,但很想听听为什么@sagarpandya82
-
虽然
map像each一样迭代,但它们是不同的工具。在实际使用中,我们看到人们在应该使用map时尝试使用each,结果他们编写了更多代码。相反,他们会使用map而不是each,最终也会编写太多代码。map用于更改值,each用于循环它们。您可以强制重叠,但这会违反流程,因此请了解何时使用它们中的每一个。 -
当你必须在地图之后使用 compact 时,很有可能你做错了什么,例如在块中使用不返回值的条件。地图块的每个循环都应该返回一个可用的值。如果您通过紧凑的方式丢弃值,那么您的代码会浪费 CPU 时间,您应该在将缩减集传递给
map之前确定使用select或reject处理哪些值。 -
换句话说,如果您想要的结果是一个带有@的数组,那么您的示例将是使用
map的正确方法987654341@s 代替不等于2和4的值。由于这不是您想要的结果(正如需要compact所证明的那样),map在这里是错误的选择。
标签: ruby