论坛首页 编程语言技术论坛

显式self和隐式self的区别

浏览 2975 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-03  
1.
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不会。


   发表时间: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


2 请登录后投票
   发表时间: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起到了强制把标识符看做方法的作用。
0 请登录后投票
   发表时间:2009-05-08  
嗯,这几天在学习Programming Ruby,看到过这个问题,所以补充了一点。

Programming Ruby的确是一本好书,这几天有空复习中,觉得对Ruby的理解有较大提高,强烈推荐。
0 请登录后投票
   发表时间:2009-05-08  
crazycode 写道
嗯,这几天在学习Programming Ruby,看到过这个问题,所以补充了一点。

Programming Ruby的确是一本好书,这几天有空复习中,觉得对Ruby的理解有较大提高,强烈推荐。

啊,我以前看过programming ruby,当时没啥感觉,只是看看基本语法。。感觉ruby for rails也不错,正在看呢~~
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics