ruby中的alias和alias_method

ruby中的alias和alias_method都可以重命名一个方法,它们的区别如下:

1.alias是ruby的一个关键字,因此使用的时候是alias :newname :oldname

alias_method是Module类的一个方法,因此使用的时候是alias_method :newname,:oldname,有一个逗号。

2.alias的参数可以使用函数名或者符号,不能是字符串。

alias_method的参数可以是字符串,或者符号。

如下代码:

 1 class Array
 2   alias :f1 :first
 3   alias f2 first
 4   alias_method :f3,:first
 5   alias_method "f4","first"
 6 end
 7 p [1,2,3].f1
 8 p [1,2,3].f2
 9 p [1,2,3].f3
10 p [1,2,3].f4

输出:

1
1
1
1

3.它们在下面一种情况下有区别。

 1 class A
 2
 3   def method_1
 4     p "this is method 1 in A"
 5   end
 6
 7   def A.rename
 8     alias :method_2 :method_1
 9   end
10 end
11
12 class B < A
13   def method_1
14     p "This is method 1 in B"
15   end
16
17   rename
18 end
19
20 B.new.method_2
21
22

23 class A
24
25   def method_1
26     p "This is method 1 in A"
27   end
28
29   def A.rename
30     alias_method :method_2,:method_1
31   end
32 end
33
34 class B < A
35
36   def method_1
37     p "This is method 1 in B"
38   end
39
40   rename
41 end
42 B.new.method_2

输出是

"This is method 1 in A"
"This is method 1 in B"

从结果可以看到,如果是alias_method,调用的是子类的方法,如果用的是alias,调用的是父类的方法。

时间: 2024-10-07 12:20:03

ruby中的alias和alias_method的相关文章

谈谈Ruby中的类变量

Ruby中的类变量,很多文章都是不太建议使用的,主要原因在于他的一些特性容易导致犯一些错误,尤其在广泛使用元编程的时候. 初步接触类变量可能觉得他跟C++的类静态成员和Java中的静态变量没什么区别,但在实际使用中一不留神就会掉到类变量的陷阱中去 陷阱1,类变量跟类实例变量不同,类实例变量关联的是self,但类变量关联的是当前类作用域 class C end class D end class C @@var = "C" def D.getvar @@var end end class

(补充1)Ruby中的p、puts、print对比

p 和 puts 是 Ruby 中特别常用的方法,很多童鞋可能认为它们是差不多的,使用的时候也不加注意,但是仔细考究起来,它们是有明显差别的. 先举一个例子: class Foo def inspect "foo from inspect" end def to_s "foo from to_s" endendfoo = Foo.newp fooputs foop "p: <#{foo}>"puts "puts: <#

在 Ruby 中执行 Shell 命令的 6 种方法

我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb >> exec 'echo "hello $HOSTNAME"' hello codefun $ 注意 exec 利用 echo 命令替换了 irb 进程,然后退出.因为 Ruby 实际上结束了该方法,所以只能有限使用.该方法的缺点是,你无法从 Ruby 脚本中知道命令是执行成功

理解Ruby中的作用域

作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够,但在你看看完我的这篇文章后,相信你不会再担心会遇到这些头疼的问题. 什么是作用域? 当谈论到作用域的时候,应该马上想到变量和可见性这两个词,变量和可见性是作用域的主要内容,没错,作用域就是关于在代码的什么地方什么变量是可见的,当你充分了解了作用域后,给你一段代码,你可以轻易知道此时什么变量是可见的,

关于ruby中的空指针保护(||=)

平时我们在写代码,构造嵌套数据或者给某个变量初始化时会用到下面这种形式: a ||= []  ; a = b || c ; a = a || [] 这种形式可以保证,在这些变量要被访问的时候才进行初始化,给我们构造数据带来了极大的灵活性:而这就是ruby中的空指针保护的应用. 要理解空指针保护的工作方式,要从ruby真假值和||操作法两方面着手: 首先,在ruby中除了nil和false被作为false外,其它值就被认为是true 其次,表面上||操作符会在两个表达式中任何一个为true时返回t

Ruby中的require、load、autoload

  require.load.autoload是Kernel模块中定义的方法,由于Class类和Object类都混入了Kernel模块,所以无论self是对象还是类,都可以调用这些方法. 这三个方法都用来加载和执行其他文件,但是有细微的不同,本文将从参数.函数执行.返回值三个方面简要介绍下这三个函数. 1. require(name) -> true or false or raise LoadError http://ruby-doc.org/core-2.1.2/Kernel.html#me

ruby中的方法查找

ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicObject类).这期间经历过的路径就是祖先链. 1混含模块和继承的方法查找 对于一个实例对象,先找它属于的类中是否有对应的实例方法,然后看这个类中是否有模块,如果有,查找模块中是否有对应的方法,如果没有,则查找父类.先看父类的实例方法,再看父类中是否有模块,再看父类的父类..一直到最后,BasicO

Ruby中访问控制符public,private,protected区别总结

重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this class”, 但是Ruby中意为 “private to this instance”.意思是:C++中,对于类A,只要能访问类A,就能访问A的对象的private方法.Ruby中,却不行:你只能在你本对象的实例中访问本对象的private方法.因为Ruby的原则是“private意为你不能指定方法接收

[No000010] Ruby 中一些百分号(%)的用法小结

#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#%Q #用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") puts %Q(1.Joe said: "Frank said: "#{what_frank_said}"") #“#”不能省 =