锁定老帖子 主题:Ruby和Python的语法差别
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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了解不多,不好说。 |
|
返回顶楼 | |
发表时间:2006-10-11
6. python的self很讨厌,ruby没有那种繁琐的东西
------- self写惯了也就成自然了。 |
|
返回顶楼 | |
发表时间: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偶还没研究过啊,没时间了。。。 |
|
返回顶楼 | |
发表时间:2006-10-11
blog不存在
|
|
返回顶楼 | |
发表时间:2006-10-11
罪过罪过,刚才忘了用永久链接了。
|
|
返回顶楼 | |
发表时间:2006-10-11
对我来说,Python不爽的地方更多,
没有?:表达式我就觉得不方便,dive-in-python书上用的1 and a or b这个技巧实在难看 |
|
返回顶楼 | |
发表时间: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][?]这样的做法 |
|
返回顶楼 | |
发表时间:2006-10-11
[b,a][?]不是shortcut的
|
|
返回顶楼 | |
发表时间:2006-10-11
cookoo 写道 1. well...python还没block呢 lambda不就是block?为什么说没有? |
|
返回顶楼 | |
发表时间: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的世界里面。 |
|
返回顶楼 | |