浏览 2975 次
锁定老帖子 主题:显式self和隐式self的区别
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-03
class DiffSelf public def method1 puts "call method1" end def method2 puts "call method2" self.method1 end def method3 puts "call method3" method1 end end t=DiffSelf.new t.method2 #call method2 #call method1 t.method3 #call method3 #call method1 2. class DiffSelf private def method1 puts "call method1" end public def method2 puts "call method2" self.method1 end def method3 puts "call method3" method1 end end t=DiffSelf.new t.method2 #call method2 #private method error t.method3 #call method3 #call method1 3. class DiffSelf1 private def puts(str) "private method :#{str}" end public def call_puts_with_self(str) self.puts str end def call_puts_without_self(str) puts str end end t=DiffSelf.new t.call_puts_without_self("Hello,world!") #Hello ,world! t.call_puts_with_self("Hello,world!")#private method error 结论: 1.ruby的私有方法只能被隐式self调用,而public和protected 方法可以被显式self和隐式self调用,隐式self更具灵活性。 2.隐式self如果遇到没有的方法会按照类的类继承和mixin的优先级查找直到,而显式self不会。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-07
最后修改:2009-05-07
还有一个问题:
class Sample def name=(v) @my_name = v end def chang_name(new_name) name = new_name end end 上面这个例子,调用chang_name,实际上是不会修改@my_name的值,需要显式的加上self.name才行: def chang_name(new_name) self.name = new_name end |
|
返回顶楼 | |
发表时间:2009-05-07
crazycode 写道 还有一个问题:
class Sample def name=(v) @my_name = v end def chang_name(new_name) name = new_name end end 上面这个例子,调用chang_name,实际上是不会修改@my_name的值,需要显式的加上self.name才行: def chang_name(new_name) self.name = new_name end 这个现象的原因是:方法name=和变量名name照成的。 如果存在同名方法和变量,并且使用裸词标识符(name)那么变量具有优先权。就是说你那句实际执行的时候被当做了一个普通的赋值语句 name=new_name而不是self.name=(new_name) self.name=这里强制将标识符看做是方法 所以这里的self起到了强制把标识符看做方法的作用。 |
|
返回顶楼 | |
发表时间:2009-05-08
嗯,这几天在学习Programming Ruby,看到过这个问题,所以补充了一点。
Programming Ruby的确是一本好书,这几天有空复习中,觉得对Ruby的理解有较大提高,强烈推荐。 |
|
返回顶楼 | |
发表时间:2009-05-08
crazycode 写道 嗯,这几天在学习Programming Ruby,看到过这个问题,所以补充了一点。
Programming Ruby的确是一本好书,这几天有空复习中,觉得对Ruby的理解有较大提高,强烈推荐。 啊,我以前看过programming ruby,当时没啥感觉,只是看看基本语法。。感觉ruby for rails也不错,正在看呢~~ |
|
返回顶楼 | |