微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ruby的map方法如何与&first一起使用?

如何解决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 举报,一经查实,本站将立刻删除。