该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-05
操纵循环变量我觉得是bad smell,应该写成递归:
def pc(klass) print klass print ' <<< '; pc(klass.superclass) if klass.superclass end >> pc(123.class) Fixnum <<< Integer <<< Numeric <<< Object <<< => nil |
|
返回顶楼 | |
发表时间:2006-11-06
一定要说哲学问题,也是有的,至少有帮派问题
Ruby受到Lisp的影响还是比较深的,从Ruby的源代码宏、变量、函数的命名上就可以看到 nil(Lisp 的空列表)和#f是Lisp的两个假值,除此之外都是真值,这就是Ruby为什么这么做的原因,代码如下 172 /* special contants - i.e. non-zero and non-fixnum constants */ 173 #define Qfalse ((VALUE)0) 174 #define Qtrue ((VALUE)2) 175 #define Qnil ((VALUE)4) (ruby.h) Qfalse,Qtrue, Qnil中的”Q”是什么呢?为什么是Q而不是Ruby的R呢?Matz说因为“Emacs就是这样的". 178 #define RTEST(v) (((VALUE)(v) & ~Qnil) != 0) (ruby.h) 在Ruby中,false和nil是假的而其它对象都是真的。但是nil(Qnil)在C中则变成真的。宏RTEST()用来判断C语言对应的Ruby类型的真假。显然,只有Qfalse(全0),和Qnil才能为假。 |
|
返回顶楼 | |
发表时间:2006-11-06
"在Ruby中,false和nil是假的而其它对象都是真的"这是事实。
为什么ruby要那么做?potian说因为Lisp就是类似的那么做的。 那么,Lisp为什么要那么做呢?^_^ point又从底层的角度,描述了一些事实性的东西... 假设ruby那么做是合理的,那么可以给个例子来说明: "abc".index("a")=>0 "abc".index("d")=>nil 可见,上面的0代表的是存在,而非不存在(a出现的位置在0位置)。 而字母d不在abc中,所以为nil,代表了不存在。 这样的表示是非常合理符合人的直观的。 问题其实出在0这个数字上面,哈哈。因为,假如我们认为ruby那么做“不”是合理的,那么也可以用0作为一个例子: 0这个数字有多种含义,一些情况下代表没有,一些情况下又代表有。在boolean中,0代表的是假,1代表的是真。而ruby把0和1都认为是真。这是和boolean的规定相冲突的,因此不能“直接”套用boolean的定律和规则来对待0和1的真假。所以到底是boolean的规定好,还是ruby的规定好,我就不说了。 |
|
返回顶楼 | |