bacon.rb 源码阅读2
不敢谈源码分析了,因为自己水平不够呀,看C都比看gem的代码容易。
边看代码,边分析其每个用法。
比如
Counter=Hash.new(0)
的用法,我打开irb,做个试验,才发现,这是让每个hash的默认值变为0
再比如
RestrictName =// unless defined? RestrictName
也做个试验,才知道,原来是当变量没有定义时,才赋值给空串,如果已经定义,就不要赋空串了。
另个,代码中有一处用法
module H1
module H2
def hello; p "haha"; end
end
extend H2
end
此时,可以如下用
H1.hello()
因为Bacon中用三个模块
SpecDoxOutput
TestUnitOutput
TapOutput
这三个模块定义的方法一样,
大致是:
module Bacon
module SpecDoxOutput
module TestUnitOutput
module TapOutput
extend SpecDoxOutput
end
也许也可以用其它的输出格式。没看懂。
module Bacon
class Context
end
end
其中,Context类也没看懂
然后作者在几个标准类中,加了猴子补丁。
如Object,TrueClass,FalseClass,Proc.
最后定义了
class Should
end
README中用例子
>> require 'bacon'
>> (1 + 1).should.equal 2
=> true
>> (6*9).should.equal 42
=> false
我把例子,做了一次,感觉很好用。但如何实现的呢?
作者在Object中加了补丁,如下:
class Object
def should(*args,&block)
Should.new(self).be(*args,&block)
end
end
但,那个be又如何意思呢?
没看懂,我把《ruby元编程》能看懂,但看这个代码,真是让人受打击呀。230行的代码,居然不能从整体上理解,真是感觉不好。才230行呀。当然对其中有些语法不理解,如\W,raise?,rescue等异常处理熟悉,但这些小节不理解,导致对整体程序的理解不懂,我不认可。
读ruby代码与读c代码完全不同,因为它们的思路就不一定。也许是我读代码的方法不对。很多地方很奇怪,象把def写在一行中,却不加分号,如
def haha 1==2 end
我的理解是应该
def haha ; 1==2 ; end
作者不加分号,真怪????
还比如
def haha(*args,&block)
end
作者在子程序中却不使用block块,也真是怪???道行太浅,如果读代码象读小说那样,就好了,我期待中。