Ruby之self详解(一)详细剖析?简单来说,ruby中的self的含义,要看其上下文。???? self上下文???? Ruby的self
Ruby之self详解(一)详细剖析
?
简单来说,ruby中的self的含义,要看其上下文。
?
??? self上下文
???? Ruby的self有和Java的this相似之处,但又大不相同。Java的方法都是在实例方法中引用,所以this一般都是指向当前对象的。而Ruby的代码逐行执行,所以在不同的上下文(context)self就有了不同的含义,先来看看常见的context self都代表哪些
module M extend self def greeting puts "hi" endend
如果没有extend self,我们就无法使用M.greeting,
现在我们可以调用M.greeting了。
BTW:
module_function可以把module一个实例方法变成私有的,并复制一份放到其metaclass中。
?
?
参考:
http://ilstar.blogbus.com/logs/59782933.html
http://fuliang.iteye.com/blog/827443
?
1 楼 ruby_windy 2011-12-13 嗯,这个受限的终于弄清楚了,多谢.关于下面的表达,一点点疑问:
第一个问题,显式self不可以调用private(protected的也一样)方法,而隐式的可以 (这个原因我在下面解释) 。
原因是什么?
Ruby代码
self.my_secret # => 显式
#这一句的self在实例方法内,所以self指的是Person的一个实例,而实例是不能调用私有方法的(protected也如此)
#注意,此时的self和我们new一个Person的实例没有本质区别。
第二个问题,self的方法不受private限制,其实我在这故意误导了读者,因为self的方法是类方法,而权限修饰符只对实例方法生效(下面解释) ,所以 private的类方法也可以直接访问。
// 这个意思是, private修饰的实例方法不受限,而类方法受限吧? 2 楼 fantaxy025025 2011-12-13 非常感谢!我此处写的是错误的。
显式的调用类的私有方法,也是不行的。
但类的内部(也就是说隐式的调用)是可以的。我补充了一点。
Person.method4 #fantaxy added here! #NoMethodError: private method `method4' called for Person:Class
Thanks! 3 楼 991142 2012-02-11 解决我的疑问!