Shut up and take the money!!!
24 小时就差不多了,足够新手尝试其他的解决问题的路径了。1 个月?黄花菜都凉了。
刚刚按照 LZ 的思路又看了看元编程,发现以前这个细节我也没注意到,对几个问题试着一一解释下吧。
1.拟态方法(Mimic Methods)和类宏(Class Macros)有什么区别?
拟态方法根据书中的定义,我觉得它主要的作用就是定义一个方法的不同调用形式,比如 puts 方法,你可以用传统的 puts("something"),也可以用puts "somethings"
,只是后者看起来不太符合我们的习惯,而看起来更像一个关键字,这就是所说的伪装
。由此可以看出,Ruby 中的相当多的方法都可以被称为拟态方法的(Mimic Methods),包括下面的类宏。
而类宏,书中给出的解释很简单,Use a class method in a class definition. 就是在一个类定义中使用一个类方法,那么这个类方法就叫类宏。注意这里的关键字是 Use 调用,而不是 Define 定义。这就引出了类宏的主要使用场景:在一个类定义中,调用一个类方法,进而达到扩展这个类的目的。
按照 LZ 给出的例子,关键代码其实是
deprecate :LEND_TO_USER, :lend_to
depercate
是一个类方法(在上面定义了),这里使用它来重新定义LEND_TO_USER
这个明显需要重构的方法,从而达到了在原有代码中加入新功能而又不影响旧代码的目的。
而你也看出来了,上面这行代码中的 deprecate 方法刚好有符合拟态方法的特征,即“看起来”不像是一个方法调用。所以它既是拟态方法,又是类宏。
总结起来说,拟态方法其实是在描述一个方法调用的外在形式(加括号和不加括号),类宏就是在描述一个方法调用的目的(用来扩展类)和使用场景(必须在类定义中使用)。所以这两者是不矛盾的。
2.(1) 当实例化(Book.new)时有没有调用哪个方法?
没有。
Ruby 是解释型语言,他遇到 class 关键字时就进入了一个新的上下文环境,在这个新环境里他定义了 3 个新方法:两个实例方法和一个类方法。然后在遇到
deprecate :GetTitle, :title
deprecate :LEND_TO_USER, :lend_to
deprecate :title2, :subtitle
时,这里的代码被执行了,几个需要被重构的方法已经被重构成新方法了。举例说,这时 LEND_TO_USER() 已经被重构为
def LEND_TO_USER(user)
warn "Warning: LEND_TO_USER() is deprecated. Use lend_to()."
lend_to(user, *args, &block)
end
所以对于 在调用 b.LEND_TO_USER("Bill") 时,具体是怎么运行的?,很简单,调用的就是上面这个方法:给一个 Warning,然后调用 lend_to("Bill") 。 一个普通的方法调用 。这样你明白了吧。
这本书讲得多,但深度还是不如 Ruby 元编程,看完后者有种一通百通的感觉。
#8 楼 @goinaction 很多大公司的遗留项目都是 VB 写的,比如我手头的这个。:-(
#14 楼 @leeboqiang 从你买入后一年内免费升级的,并且 5 的正式版已经出了,你现在就可以去升级,所以早买早赚到,我就是下手晚了,怨念..
129 元的时候已经买了,眼瞅着这货从 69 元涨到 129 元又涨到现在的 189 元,估计是因为最近升级到了 5.0 正式版。
建议购买,不同平台有不同的版本。但一个 Licence 全平台通用,装多少都没事,只要是个人用的。
让我对 C 代码的畏惧大大减小,极有价值的工作!
可否写个升级教程出来?
TED 给我帮助最大的一个演讲是来自一个 Google 员工的,题目是30 天一件新鲜事,虽然只有 4 分钟,但它已经帮助我养成了好几个好习惯---在半年之内!
强烈推荐给大家。
明年这时候还招不?。。
请问下 RubyMine 是一个 Licence 全平台通用吗?还是每个平台都要买一遍?
我看完了,感觉对 OO 有种大彻大悟的感觉。年后我准备把我我的心得总结一下贴到这里。
表就是表,要么叫 Table。干吗要用**?一股老流氓气息扑面而来。要问问题就正经点,不要拿出一副自认为豪爽的“雅痞”作风。
#1 楼 @zlx_star 99% 正确,我完善一点细节啊:
如果调用了一个对象上不存在的方法,Ruby 最终会执行每一个对象都会有的method_missing
方法,由它抛出NoMethodError
异常,。
而 def method_missing; evil; end
这一行代码重写并立即执行了 irb 默认 main 对象的method_missing
方法,奥妙就在与这个重写的方法里我又胡乱编造了一个不存在的方法 evil(),irb 在执行 method_missing 时找不到这个 evil(),所以它只好再回去调用 method_missing,结果又遇到 evil()……以此循环往复,陷入无限死结中,最终结果就是堆栈溢出,irb 崩溃。
不知道分期付款的优势在哪里,最终付的钱是不是比一次性付清还多一点吗?(利息)划不来啊,求教。
国内这么多好机会啊,我坐不住了……
官网和这个网站有异曲同工之妙哦。 我不是来吐槽的,只是觉得这种设计很赞。
HTML 是男人。
看了他博客上其他几个答案,真心觉得 Ruby 废话少,懂程序员心思!