@
Los 那篇文章如果你读完的话,就知道我并非只是抨击RoR。我真正想说的是各种东西都有其适应的群体,开发者应该拿有限的时间去找适应他的技术,而不是逼自己去适应技术。
拿其中一个观点来说:Pythoner极力维护语言的纯洁性,简洁易懂是他们的哲理;Rubyer很喜欢新奇,巴不得每行代码都能用6种语法来写。
以你上面的为例:“Ruby允许一个函数可以有多个别名,比如得到 Array 的长度,有size,length甚至count”。
那么Python为什么不这么做?因为它需要简洁,这种简洁也带来了一致性和通用性,可以减少人们的疑惑和学习负担。
试想一下字符数组,它在C语言里可以当成字符串。前者或许可以有size,length甚至count,但是后者有count合理么?而在Python中,不论是内置的list、set、str、unicode、dict,还是开发者自定义的类型,一律都用__len__(self)这个接口获取长度,而且这个命名也让你趋向于选择更短的内置函数len()。
为什么要用函数而不是对象的方法?
我不知道Guido设计的初衷是怎样的,但是如果一个函数只想接收定义了__len__(self)方法的对象时,len()可以让不支持的对象抛出异常。而如果换成size(self)、length(self)和count(self)方法的话,你在定义自己的类时,为了不与标准的接口相冲突,这3个方法你都不能定义。于是你不能有square.size、rope.length和money.count,除非你保证其他人不会把这些对象当成Array。
我承认你的例子里用count确实更符合语境,但在Pythoner看来,作为一门语言的基本类型,它应该保持简洁;而在开发者需要他的语境时,才去自行定义别名。
而在Rubyer看来,他们只知道__len__很丑,len不面向对象,而且没有alias语法,这太过死板和沉闷了。
关于那个“:attachable_id=>topic_id”,我只想说人类的语言不会带:和=>。不管你学过多少门语言,只要没学过Ruby的人都看不懂这些符号。
而Python极力避免使用符号,宁愿使用关键字来取代符号。
还有我之前所提到的,那个.save让人疑惑究竟是一个属性访问,还是一个方法调用。一个get方法模拟成属性说得过去,可是这种带有强烈副作用的方法,为什么要伪装成人畜无害的样子?
假如这个对象还有个saved属性,然后你在获取它时碰巧少写了个d,而这个save方法最后会返回saved属性,会出现什么现象呢?你也许会说我有写单元测试啊,可假如你的测试代码是save == saved,或者这个错正好就发生在单元测试里呢?
我想这3点差异的本质就是:Python追求简洁,不让人疑惑;而Ruby追求自由,让自己惬意。
这也是我说“真正的Python程序员和Ruby程序员肯定是2个极端,绝对是水火不容的存在”的原因。他们的观念和care的方面完全不一样。
更多原因可以看这篇文章,有些观点现在看来存在错误,但大方向上和我现在的看法仍然相符:
http://www.keakon.net/2009/03/17/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E9%80%89%E6%8B%A9Python%EF%BC%8C%E8%80%8C%E9%9D%9ERuby其实回头想想,这有点像iOS和Android的差异。很多人想把iOS当成Android用,然后觉得很不灵活。可问题是2者本来就是风格迥异的,不适应就换一个,何苦折腾自己?
关于你的PS.2,这并不能解决根本原因,如果想用mootools呢?