Ruby 新人学 Ruby - alias, alias_method, alias_method_chain, undef, undef_method 的区别

shijin880921 · 2015年10月20日 · 最后由 shijin880921 回复于 2015年10月20日 · 3296 次阅读

今天在看 calabash 的 wait_helpers.rb 类时偶然看到了 "alias_method"。不解,就顺便查下文档,发现几个相关关键字就索性做下记录,以便以后翻阅。


alias

alias 给已经存在的方法或全局变量设置一个别名,在重新定义已经存在的方法是,还能通过别名来调用原来的方法。alias 方法的参数为方法名或者符号名。

语法: alias 别名 原名 #直接使用方法 alias :别名 :原名 #使用符号名

例子:

代码:

class AliasDemo
  $old = "old"
  def hello
    puts "old_hell0"
  end
end

class Demo2 < AliasDemo
  # 给hello方法取别名
  alias old_hello hello
  # 给全局变量$old取别名
  alias $new_in_old $old

  def hello
    puts "new_hello"
  end
end

obj = Demo2.new
obj.hello
obj.old_hello

puts $new_in_old

输出结果: new_hello old_hell0 old

alias_method

作用和 alias 差不多,是 Module 的一个私有实例方法,只能用于给方法起别名,并且参试只能是字符串或者符号(alias 后面跟的是方法名或者全局变量)而且参数间是用“,”隔开(alias 是用空格隔开)。

语法: alias_method :new_name, :old_name

例子: 代码:

class AliasMethodDemo
  def b
    puts "b"
  end

  alias_method :b_new, :b

  b = AliasMethodDemo.new
  b.b_new
  b.b
end

输出结果: b b

alias_method_chain

技术文档总是会过时的,百度还能找到这个关键字的说明,然而已经不再使用了。


undef 和 undef_method

这两个方法效果的等效的,都是用于取消方法定义。undef 不能出现再方法主体内。undef 和 rails 一样,参数可以指定方法名或者符号名,undef_method 后面参试只能是字符串或者符号。如果一个类继承了某个父类,使用了这两个方法取消方法,会连带父类也会一起取消。

语法: undef 方法名 #直接使用方法名 undef :方法名 #使用符号名 undef_method :方法名

remove_method

如果你只想移除子类的方法,而不想移除父类的方法,那么 remove_method 符合你需求。 语法: remove_method :方法名

例子: 代码:

class Parent
  def hello
    puts "In parent"
  end
end
class Child < Parent
  def hello
    puts "In child"
  end
end

c = Child.new
c.hello

class Child
  remove_method :hello # 移除子类的hello方法,父类还在
end
c.hello

class Child
  undef_method :hello # 连父类的hello方法一起删除,不允许任何地方调用 'hello'
  # undef hello  # 等效上面的undef_method
end
c.hello

输出结果:

=>:in `<top (required)>': undefined method `hello' for #<Child:0x007fe08c84c690> (NoMethodError)
    from -e:1:in `load'
    from -e:1:in `<main>'
In child
In parent

先把排版格式整理一下吧,否则@rei会抓狂的,https://ruby-china.org/markdown

#1 楼 @markgeek 不同的编辑器 md 格式不太一样。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号