2014-11-14 108 views
1

有人可以帮我理解下面的代码吗?有人可以解释respond_to吗? :每?

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

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

:each一个全局方法吗?为什么我们可以这样写呢?或者我可以如何了解它?

回答

7

:each是一个Symbol,这有点像String,但更有限,更有效的比较平等。它是不是的一种方法;它确实是一种方法名称

respond_to?是在Object上定义的方法,几乎​​所有的Ruby对象都最终从中继承。

当你说[1, 2, 3, 4].each时,它会发送信息:eachArray对象[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中它是语句分隔符。因此编写array = [1, 2, 3, 4];是不好的风格。

+3

+1你解释得好多了。注意:变量'array'实际上命名不好,因为它也可能包含与Array不同的东西,因此检查。 –

+0

谢谢,好点。 – Amadan

+0

谢谢你一吨!现在感觉好多了〜! :D也,我看到一些文档说,如果我们定义一个字符串像: – wiwengweng