如何解决Ruby的map方法如何与&first一起使用?
不久前,我在Ruby中进行了编码挑战,希望更好地理解以下语法的工作方式,尤其是表达式的最后一部分(&:first)。
def remove_every_other(arr)
arr.each_slice(2).map(&:first)
end
测试:
Test.assert_equals(remove_every_other(['Hello','Goodbye','Hello Again']),#=> ['Hello','Hello Again'])
Test.assert_equals(remove_every_other([1,2,3,4,5,6,7,8,9,10]),#=> [1,9])
Test.assert_equals(remove_every_other([[1,2]]),#=> [[1,2]])
Test.assert_equals(remove_every_other([['Goodbye'],{'Great': 'Job'}]),#=> [['Goodbye']])
Test.assert_equals(remove_every_other([]),[])
解决方法
&
是对方法的引用。:first
是一个符号。
因此,&:first
只是对任何对象中名为first
的方法的引用。
因此,这与说arr.each_slice(2).map {|it| it.first }
一样。
当您将方法映射到集合的元素时,Ruby只会在集合的元素上调用该方法。在您的情况下,arr.each_slice(2)
将返回两个arr
的元素(请参见each_slice的文档),因此如果您的数组是[1,2,3,4,5,6,7,8]
是包含[[1,2],[3,4],[5,6],[7,8]]
的集合。映射:首先对该集合进行映射意味着在每个元素上调用first
方法,[1,2].first
仅返回1
,而[7,8].first
返回7
。
当map
方法返回一个集合时,每个元素都被对该方法的调用结果替换,因此您会发现自己拥有一个包含每对中的第一个的集合。这就是它删除所有其他元素的方式。
请注意,如果原始集合的元素数量为奇数,则最后一个元素将是一个数组,而不是两个元素(请参阅doc_each_slice),因此,如果数组为[1,3]
,则切片为{{ 1}},并在每个电话上调用[[1,[3]]
,将得到.first
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。