有人可以解释respond_to吗? :每?

时间:2014-11-14 06:57:59

标签: ruby

有人可以帮我理解以下代码吗?

array = [1,2,3,4];
if array.respond_to? :each
  puts "1234"
else
  puts "5678"
end

我可以理解代码的结果,但:each的语法是什么?

:each是全局方法吗?为什么我们这样写呢?或者我怎么能找到它?

1 个答案:

答案 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];是一种糟糕的风格。