有人可以帮我理解以下代码吗?
array = [1,2,3,4];
if array.respond_to? :each
puts "1234"
else
puts "5678"
end
我可以理解代码的结果,但:each
的语法是什么?
:each
是全局方法吗?为什么我们这样写呢?或者我怎么能找到它?
答案 0 :(得分:7)
:each
是一个Symbol
,有点像String
,但更有限,在比较平等方面效率更高。 不是方法;它恰好是一个方法 name 。
respond_to?
是在Object
上定义的方法,(几乎)所有Ruby对象最终都继承自该方法。
当您说[1, 2, 3, 4].each
时,它会将消息:each
发送到Array
对象[1, 2, 3, 4]
。 Array
类对象知道它的实例在收到这样的消息时会知道该怎么做,因此Array.respond_to?(:each)
返回true
。基本上,如果array.respond_to?(:each)
为false
,则array.each
会引发错误。 [请注意,正如评论中的p11y注释,如果array
确实是Array
,那么这将始终返回true
。但程序员可以撒谎,array
不一定是Array
;例如:array = "not an Array, fooled you!"
]
[1, 2, 3, 4].respond_to? :each
相当于[1, 2, 3, 4].respond_to?(:each)
。
另外,如果你想在一行中填充几个语句,那么只需要在Ruby中使用分号。例如,与C不同,分号是语句终结符,在Ruby中,它是语句 separator 。因此写array = [1, 2, 3, 4];
是一种糟糕的风格。