• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby学习笔记(9)-别名(alias)与方法取消(undef,remove_method)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

先来看别名,ruby中可以给方法或全局变量起一个别名,有意思的是:方法别名定义后,即使对应的方法在后面的代码中重新定义(即修改内部实现)后,别名仍然可以调用到修改前的方法,而全局变量则不行。

def meth
  puts "This is meth"
end

alias:orgin_meth:meth

meth #=> This is meth
orgin_meth #=>This is meth

def meth
  puts "a new meth"
end

meth #=> a new meth
orgin_meth #=> This is meth (注意这里仍保留老方式的特性)

$a = 1
alias $b $a #将全局变量a,另取个别名b
$b = 2
p $a,$b #=> 2,2 (注意这也方法别名的不同)

再来说说方法取消:
利用undef或undef_method,可以将类的方法取消定义(也可以理解为彻底删除掉),这没什么不好理解,但要注意的是:如果一个类继承自父类,并且又定义了与父类同名的方法,用undef取消该方法后,将连带父类的同名方法一起取消(其实也很正常:动态语言世界里,子类重定义了父类继承得来的重名方法,相当于覆写了该方法,所以子类实例调用时也只能调用到子类自身的同名方法,一旦取消后,该方法[不管是父类的,还是子类的]将与子类再无任何牵挂)

class Base
  def meth
    puts "Base.meth"
  end
end


class SubClass1 < Base
  def meth #相当于重写了父类的meth方法
    puts "SubClass1.meth"
  end 
  
  def meth2
   puts "SubClass1.meth2"
  end 
  
end

s1 = SubClass1.new
s1.meth #=>SubClass1.meth
s1.meth2 #=>SubClass1.meth2

class SubClass1 
  undef:meth2
  #undef_method(:meth2) #这句话与上面的等效
  undef:meth # 注意这里:取消meth的定义后,连父类继承的meth也将无法调用 
end

#s1.meth #将报错

如果我们只想取消子类中的方法,而保留父类继承得来的同名方法,怎么办?答案就是:remove_method,把上一段代码的最后部分改成:

class SubClass1 
  undef:meth2
  #undef_method(:meth2) #这句话与上面的等效
  remove_method(:meth) #仅移除子类的meth方法
end

s1.meth #=> Base.meth

可以看到,调用s1.meth时,使用的是父类的meth方法


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
用sublime Text2来开发ruby on rails项目发布时间:2022-07-13
下一篇:
使用Ruby简单实现的tail命令,支持动态输出发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap