我先上代码
def hello puts "hello world" end alias ori_hello hello def hello puts "a new hello" ori_hello puts "this is a new hello" end
问题: 1:旧的 hello 是不是已经不存在了?如果存在如何调用(除了用 ori_hello) 2: 新的 hello 算是给旧的 hello 方法新增功能吗?与元编程有何不同?
orig_hello
hello
坐等大牛们正解!
#1 楼 @Martin91 赞。
以下内容纯属臆测
首先,你可以想像有一张表在维护着 方法名 和 方法体 的映射。
方法名是方法体的名字 (废话), 比如 hello, ori_hello 就是方法名。 方法体是计算机内部对象,我们估且称呼不同的方法体为方法体1,方法体2吧
方法名 belongs_to 方法体 方法体 has_many 方法名
就你以上的例子: def hello后,映射表是这样的 hello --> 方法体 1
def hello
alias ori_hello hello后,映射表是这样的 hello --> 方法体1 ori_hello --> 方法体1
alias ori_hello hello
再def hello后 映射表是这样子的 hello --> 方法体2 ori_hello --> 方法体1
所以, 问题 1.1: 旧的 hello(即方法体1) 依旧存在,只不过现在它只有一个方法名叫 ori_hello。 问题 1.2: 实际上我们是可以在代码中获取到方法体的,所以不用 ori_hello,也是可以调用旧 hello 的
def hello puts 'hello world' end method_body = method :hello def hello puts 'hello china' end hello // ==> hello china method_body.call //==> hello world
问题 2.1: 新的 hello(即方法体2) 跟旧的 hello(即方法体1)没有一毛钱关系。只不过是 凑巧 在方法体2中调用了方法体1而已。 问题2.2: There is no such thing as metaprogramming. It's just programming all the way through.
一个 cp,一个 mv.
#3 楼 @sallon88 数据表这种思考方式,很像 java 虚拟机的工作方式啊
#3 楼 @sallon88 能详细解释一下你的“method_body = method :hello”这行吗?因为我不知道这个 method:是什么意思,它属于那个类库,是那个类之类的信息,或者给我一个 google 的关键字,让我进一步了解一下
@u1378130755 method 是个方法
#6 楼 @u1378130755 那个 method 是 Object 的方法, http://ruby-doc.org/core-2.0.0