论坛首页 编程语言技术论坛

Ruby和Python的语法差别

浏览 43291 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-10-11  
ajoo 写道
我说几个ruby让我不爽的地方,pythoner来说说python是不是更好

1。block/proc的区别。概念冗余。而且造成meta-code写起来有障碍。python是不是只有lambda?
2。require不是像java的import一样只输入符号表,而是执行一个文件。更象c的#include。而且require还不能有效检查两个文件是否相同。
3。没有包私有概念。
4。没有一个module loader的概念。一个库的文件之间依赖,还要写require 'mylibname/filename'。这个mylibname很别扭。
5。string不是unicode的。
6。string是mutable的。


python中import也是执行一个文件,但是只是在第一次被import的时候才执行(不过这个执行只是模块级全局变量的赋值,如顶级的函数/类定义),其后的因为可以在全局符号表找到,所以不需要执行了(除非显式reload). 这个动作其实和java类被第一次load的时候得动作类似

其实我觉得python最爽的地方就是终于不用太OO了。
以前玩java的时候明明只需要一个辅助性函数,却非得搞一个helper类,策略模式的实现也是类飞来飞去的。
在python里面,我这样写一个工厂:
def simple_reproducer_factory(): 
    def reproducer(seeds,gametes):
        ......
        return children
    reproducer.times_of_length = 1
    return reporducer

因为函数实际上也是对象,可以有自己的属性,所以有些东西就不需要用到静态变量或者全局变量,直接当作属性好了。 简直帅呆了.........
但是我对ruby了解不多,不好说。
0 请登录后投票
   发表时间:2006-10-11  
6. python的self很讨厌,ruby没有那种繁琐的东西
-------
self写惯了也就成自然了。
0 请登录后投票
   发表时间:2006-10-11  
charon 写道
其实我觉得python最爽的地方就是终于不用太OO了。
以前玩java的时候明明只需要一个辅助性函数,却非得搞一个helper类,策略模式的实现也是类飞来飞去的。
在python里面,我这样写一个工厂:
def simple_reproducer_factory(): 
    def reproducer(seeds,gametes):
        ......
        return children
    reproducer.times_of_length = 1
    return reporducer

因为函数实际上也是对象,可以有自己的属性,所以有些东西就不需要用到静态变量或者全局变量,直接当作属性好了。 简直帅呆了.........
但是我对ruby了解不多,不好说。

这个例子蛮有说服力的,我以前总认为python那样随时能用obj.new_attr = xx的prototype OO风格添加新属性的方法比较危险,万一碰到手误打错字很郁闷。“太过OO“的Ruby虽然不能直接支持这么干,不过用点meta programming魔法就可以了,参见以前和ajoo讨论后我写的blog。这样在ruby里就写成
reproducer.better_accessor :times_of_length => 1


BTW, python2.5偶还没研究过啊,没时间了。。。
0 请登录后投票
   发表时间:2006-10-11  
blog不存在
0 请登录后投票
   发表时间:2006-10-11  
罪过罪过,刚才忘了用永久链接了。
0 请登录后投票
   发表时间:2006-10-11  
对我来说,Python不爽的地方更多,
没有?:表达式我就觉得不方便,dive-in-python书上用的1 and a or b这个技巧实在难看
0 请登录后投票
   发表时间:2006-10-11  
njmzhang 写道
对我来说,Python不爽的地方更多,
没有?:表达式我就觉得不方便,dive-in-python书上用的1 and a or b这个技巧实在难看


2.5 里面有一个和ruby差不多的if/else赋值语句,和?:差不多了
1 and a or b还是比较少用的,应为a必须为真值,一般都是[b,a][?]这样的做法
0 请登录后投票
   发表时间:2006-10-11  
[b,a][?]不是shortcut的
0 请登录后投票
   发表时间:2006-10-11  
cookoo 写道

1. well...python还没block呢

lambda不就是block?为什么说没有?
0 请登录后投票
   发表时间:2006-10-11  
cookoo 写道

这个例子蛮有说服力的,我以前总认为python那样随时能用obj.new_attr = xx的prototype OO风格添加新属性的方法比较危险,万一碰到手误打错字很郁闷。

这个用上__slots__就可以了。
但是说到这类打字错误,python和ruby都是难兄难弟,ruby不比python强一点,也不会弱。都需要靠单元测试来确定这类错误,属于50步 vs 50步.

引用

“太过OO“的Ruby虽然不能直接支持这么干,不过用点meta programming魔法就可以了,参见以前和ajoo讨论后我写的blog。这样在ruby里就写成
reproducer.better_accessor :times_of_length => 1


还是有重要差别的,首先那个simple_reproducer_factory是一个顶级的函数,不在任何class里面,其次这个reproducer也是一个函数,这两个家伙都不是方法. 但是对于函数对象,还可以往上添加属性.
前面说的不够OO主要是指这个意思,使我不必再纠缠在class的世界里面。
0 请登录后投票
论坛首页 编程语言技术版

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