论坛首页 入门技术论坛

ruby 怪异的while循环处理,和java的差别

浏览 8027 次
该帖已经被评为新手帖
作者 正文
   发表时间: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
0 请登录后投票
   发表时间: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才能为假。

0 请登录后投票
   发表时间: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的规定好,我就不说了。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics