我是 ruby 的新手,正在完成教程,但不确定这行代码是什么意思:
[movie, version_number].any?(&:nil?)
根据我的研究,如果数组的任何元素不false
或nil
,Array.any?
返回 true。&:nil?
的意思是在符号:nil?
上调用to_proc()
,即:nil?.to_proc
,所以语句等效于
[movie, version_number].any?(:nil?.to_proc)
相当于
[movie, version_number].any?{|item| item.nil?}
此外,any?
将集合的每个元素(在本例中为 Array)传递到{|item| item.nil?}
块。
当你把它们放在一起时,代码行是否意味着,在数组上调用.any?
之前,先对数组中的每个元素调用nil?
,即它是否等效于:
[movie.nil?, version_number.nil?].any?
或者,用简单的英语来说,电影或version_number中的任何一个等同于nil吗?
来自 Symbol#to_proc 文档:
返回一个 Proc 对象,该对象通过 sym 响应给定的方法。
(1..3).collect(&:to_s) #=> ["1", "2", "3"]
所以在你的情况下,这实际上与写作相同:
[movie, version_number].any?{|item| item.nil? }
any?
期望传递一个块[1],它将针对每个项目进行评估,如果该块对任何成员的计算结果为 true,则将返回 true。
Symbol 上的to_proc
方法基本上是一个方便的快捷方式,当您只想对传递给块的项目调用单个方法时。如上例所示,这会导致代码比显式定义块更短。
[1]参考这篇文章 关于 ruby 中的块、过程和 lambda