首 页 » 程序开发 » Ruby中的Main分析

Ruby中的Main分析

[ 2014-08-29 20:09 | 浏览次数: 2,481次 | 0条评论 ]

一般程序都有入口,比如C语言入口是main函数,所以进入程序后我们会到main函数的第一行.那么在进入ruby程序后我们是在哪个位置呢?

可以通过打印self来知道当前上下文.

puts self,self.class

通过输出我们发现是在一个叫main对象的上下文中.

再查看对象所属类是[Object< Kernel< BasicObject],怪不得我们可以直接调用puts等函数,原来我们在这些类中(Kernel提供了puts函数).

那么最关键的是初始代码到底是什么摸样的?

首先当前是对象上下文,因此可以推测我们是在一个叫main的对象的调用方法中.比如:

Object

main.run  #我们就在这个run函数中

我们通过查看self的所有方法,发现没有定义新的方法,不过我们发现有个方法叫instance_eval,这个可以打开对象并操作,比如添加属性,函数等任何ruby语句,在这个函数中就是对象的上下文.

于是我们推测启动代码可能是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Object  
	Object.new.instance_eval do  
		def to_s  #设置名字为main
		  "main"  
		end  
		def inspect  
		  "main"  
		end  
		private  #设置你的代码全部是private
		##  
		# Your program gets inserted here...  
def fun1
end
		##  
	end  
end

或者是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main = Object.new
main.instance_eval do
	def to_s  
      "main"  
    end  
    def inspect  
      "main"  
    end  
   	private
    ##  
# Your program gets inserted here...  
def fun1
end
    ##  
end

 

当我们将代码运行试验时发现有几个问题,

1. Private在测试代码instance_eval中不认,但在真实的ruby中可以(按照道理这个只能定义在类中)

2. 我们在后面添加的代码fun1是main对象的独有方法且是公开的,而真实的ruby会将fun1

变为类Object的方法且是私有的

因此我们怀疑ruby特殊对待启动代码了,它让我们的初始环境看起来既像在main对象中又像在Object类定义中.它允许我们像在类定义中一样使用private,public,定义的方法不是对象独有的而是Object类的,这样所有地方都可以调用这个方法而不需要传递main对象.

参考:

http://stackoverflow.com/questions/6639141/if-main-is-an-instance-of-object-why-cant-i-call-it-in-irb

https://groups.google.com/forum/#!topic/comp.lang.ruby/e7e0UajzzKc

您可以任意转载本文,但转载时请勿删除作者信息。
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/1054.html
Tags:
上一篇: | 下一篇:

沙发为空,还不快枪?[点此发言]

目前还没有任何评论.