埃里克·马克斯·弗朗西斯(Erik Max Francis)写道:
“布兰登·范·凡·布朗”写道:
Ruby比Python有什么更好的选择?我确定有事 它是什么?向Ruby人员(而不是Python人员)问这个不是更有意义吗?
可能(也可能不会)取决于一个人的目的-例如,如果一个人的目的包括对Python社区的“社会学研究”,那么向该社区提出问题很可能证明它具有比其他地方更多的信息揭示能力:-)。我个人很高兴借此机会在上一次OSCON上关注Dave Thomas的为期一天的Ruby教程。在语法差异的明显变化之下,我发现Ruby和Python惊人地相似-如果我正在计算几乎所有语言集中的最小生成树,我很确定Python和Ruby将成为合并的前两叶中间节点:-)。
当然,在Ruby中,我确实会在每个块的末尾键入愚蠢的“ end”(而不是不缩进)而感到疲倦-但是,我确实避免避免在:
Python的
开头键入同样傻的每个街区,所以差不多要洗了:-)。其他语法差异(例如@foo
vs
self.foo
)或Ruby vs Python中case的重要性更高,实际上与我无关。
毫无疑问,其他人正是基于这样的问题来选择编程语言,并且引发了最激烈的辩论-但对我而言,这只是帕金森定律中一个行动的例子(关于某个问题的辩论数量与该问题的辩论成反比)实际重要性)。我确实发现语法上的差异很重要,并且对Python有利-但其他人无疑会认为相反-是“如何调用不带参数的函数”。在Python(如C语言)中,要调用函数,您始终要应用“调用运算符”-括号紧跟在您要调用的对象之后(在这些括号内是您在调用中传递的args,如果您没有传递参数,则括号为空)。这仅涉及任何对象,不涉及运算符,仅表示对对象的引用-在任何情况下都没有特殊情况,异常,特别规则等。在Ruby中(就像在Pascal中一样),要调用带有WITH参数的函数,您需要传递args(通常在括号中,尽管并非总是如此)-但是,如果该函数没有args,则只需提及该函数即可。这也许可以满足许多人的期望(至少,毫无疑问,至少那些以前的编程经验是使用Pascal或其他具有类似“隐式调用”的语言(例如Visual Basic)的人)-但对我来说,这意味着仅提及对象可能意味着对该对象的引用或对该对象的调用,取决于对象的类型-在某些情况下,我只能通过提及对象而无法获得对对象的引用,我将需要使用明确的“给我提供对此的引用,不要调用它!” 否则不需要的运算符。我觉得这会影响函数(或方法或其他可调用对象)的“一流”,并影响对象平滑交换的可能性。因此,对我来说,这种特定的语法差异对Ruby来说是一个严重的黑标-但我确实理解了其他人为什么会这样的想法,即使我几乎无法强烈反对它们:-)。在语法下方,我们发现了基本语义上的一些重要差异-例如,Ruby中的字符串是可变对象(例如C ++中),而在Python中它们是不可变的(例如在Java中,或者我相信C#)。同样,主要根据已经熟悉的知识进行判断的人可能会认为这对Ruby有利(除非他们熟悉Java或C#,当然:-)。我,我认为不可变的字符串是个好主意(我不觉得Java独立地重新发明了Python中已经存在的那个想法),尽管我也不介意具有“可变字符串缓冲区”类型(最好是比Java自己的“字符串缓冲区”更易于使用的代码);而且由于熟悉程度,我不作此判断-在学习Java之前,除了函数式编程语言外,主要根据已经熟悉的知识进行判断的人们可能会认为这对Ruby有利(除非他们熟悉Java或C#,当然:-)。我,我认为不可变的字符串是个好主意(我不觉得Java独立地重新发明了Python中已经存在的那个想法),尽管我也不介意具有“可变字符串缓冲区”类型(最好是比Java自己的“字符串缓冲区”更易于使用的代码);而且由于熟悉程度,我不作此判断-在学习Java之前,除了函数式编程语言外,主要根据已经熟悉的知识进行判断的人们可能会认为这对Ruby有利(除非他们熟悉Java或C#,当然:-)。我,我认为不可变的字符串是个好主意(我不觉得Java独立地重新发明了Python中已经存在的那个想法),尽管我也不介意具有“可变字符串缓冲区”类型(最好是比Java自己的“字符串缓冲区”更易于使用的代码);而且由于熟悉程度,我不作此判断-在学习Java之前,除了函数式编程语言外,我认为不可变字符串是个好主意(我不认为Java独立地重新发明了Python中已经存在的那个想法),尽管我也不介意具有“可变字符串缓冲区”类型(和理想情况下,它比Java自己的“字符串缓冲区”具有更好的易用性);而且由于熟悉程度,我不作此判断-在学习Java之前,除了函数式编程语言外,我认为不可变字符串是一个好主意(我不认为Java独立地重新发明了Python中已经存在的那个想法),尽管我也不介意具有“可变字符串缓冲区”类型(和理想情况下,它比Java自己的“字符串缓冲区”具有更好的易用性);而且由于熟悉程度,我不作此判断-在学习Java之前,除了函数式编程语言外,所有数据都是不可变的,我所知道的所有语言都具有可变的字符串-但是,当我第一次看到Java中的不可变字符串的想法(我在学习Python之前就学得很好)时,它立即使我印象深刻,非常适合顶级编程语言的引用语义(与最适合于距离机器更近,距离应用程序(例如C)更远的语言的值语义相反)的字符串是一流的,内置的(而且很漂亮)关键)数据类型。
Ruby在基本语义上确实具有一些优势-例如,删除Python的“列表与元组”极其微妙的区别。但是大多数情况下,分数(就我而言,保持简单,是一个很大的加和微妙的,聪明的区别,是一个显着的减号)与Ruby相对(例如,同时具有封闭和半开放时间间隔,用符号a..b和a.。 .b [任何人都想声称哪个是显而易见的?-)],这很愚蠢-当然,恕我直言!同样,考虑到在语言的核心上有很多相似但又细微不同的事物的人,加号(而不是减号)当然会根据我的计算方式来反加这些:-)。
这些比较不要误导他们认为这两种语言
非常不一样,请注意。他们不是。但是,如果要求我将“意大利面条”与“意大利面条”进行比较,并指出这两种意大利面几乎对任何人都没有区别,并且在您可能要准备的任何菜肴中都可以互换,那么我将不可避免地拥有进行显微镜检查,以了解长度和直径的显着差异,在一种情况下而不是在另一种情况下股线的末端如何逐渐变细等等,以尝试解释为什么我个人更愿意使用Capelli d '安杰洛(Angelo)作为任何一种肉汤的面食,但更喜欢将意大利面条(spaghettini)用作面食(pastasciutta),并搭配适用于此类长而细的面食形式的调味料(橄榄油,蒜末,剁碎的红辣椒和细碎的凤尾鱼,例如-但是,如果您将大蒜和辣椒切成薄片而不是切成薄片,那么您应该选择意大利面更健康的面条,而不是意大利面条稀薄的消逝,并建议您不要使用achoview,而应添加一些新鲜的春季罗勒[甚至-我是一个异端...!-薄荷...]树叶-在上菜之前的最后一刻)。糟糕,抱歉,这表明我正在国外旅行,并且有一段时间没有意大利面了。但比喻还是相当不错的!-)建议不要使用achoview,而是加入一些新鲜的春季罗勒[甚至-我是一个异端...!-薄荷...]树叶-在上菜之前的最后一刻)。糟糕,抱歉,这表明我正在国外旅行,并且有一段时间没有意大利面了。但比喻还是相当不错的!-)建议不要使用achoview,而是加入一些新鲜的春季罗勒[甚至-我是一个异端...!-薄荷...]树叶-在上菜之前的最后一刻)。糟糕,抱歉,这表明我正在国外旅行,并且有一段时间没有意大利面了。但比喻还是相当不错的!-)
因此,回到Python和Ruby,我们谈到了两个大问题(就适当的语言而言-离开了库以及其他重要辅助工具(例如工具和环境),如何嵌入/扩展每种语言等),现在-它们将不会应用于每种语言的所有实现,例如,Jython与Classic Python是Python语言的两种实现!):
Ruby的迭代器和代码块与Python的迭代器和生成器;
Ruby的TOTAL无限的“动态性”,包括“重新打开”任何现有类(包括所有内置类)并在运行时更改其行为的能力-与Python巨大但 有限的
动态性(永远不会改变现有行为)内置类及其实例。
就我个人而言,我认为1是一次洗礼(差异是如此之深,以至于我很容易看到人们讨厌这两种方法,而又讨厌另一种方法,但就我个人而言,正负几乎相等);[2]一个至关重要的问题-使Ruby更适合“修补”,而Python同样更适合用于大型生产应用程序。从某种意义上说,这很有趣,因为两种语言都比大多数其他语言更具动态性,最终它们与我的POV之间的关键区别应该在于这一点-Ruby在这方面“达到11种”(参考文献当然是“ Spinal Tap”。在Ruby中我能做到!即,我可以动态更改内置字符串类,以便
a =“ Hello World”
b =“你好世界”
如果a == b
打印“等于!\ n”
其他
打印“不同!\ n”
结束
将打印“等于”。在python中,我无法做到这一点。出于元编程,实现实验框架等目的,Ruby的这种惊人的动态能力非常强大。
吸引人。但是-如果我们谈论的是大型应用程序,它是由许多人开发并由更多人维护的,包括来自不同来源的各种库,并且需要在客户站点上投入生产...那么,我不想一种非常动态的语言,非常感谢。我讨厌这样的想法:某些库不知不觉地打破了那些依赖于那些不同字符串的其他不相关的库-这是一种深层和深层的“通道”,在LOOK分离和应该分离的代码段之间,这意味着死亡。大规模编程。通过让任何模块“隐蔽地”影响其他模块的行为,
如果必须将Ruby用于如此大型的应用程序,则我将尝试依赖于编码样式的限制,大量的测试(只要有任何更改,都将重新运行-甚至应该完全不相关...),等等。禁止使用此语言功能。但是,我认为不首先具有该功能会更好,就像Python本身可以成为应用程序编程的一种更好的语言一样,如果可以“固定”一定数量的内置程序,那么我知道例如,
len("ciao")
为4(而不是担心潜意识有关某人的是否改名的结合len
中__builtins__
模块...)。我确实希望Python最终“钉牢”其内置组件。
但是这个问题很小,因为重新绑定内置插件在Python中是不推荐使用的,也是一种罕见的做法。在Ruby中,它使我感到很专业-就像
其他语言(例如Dylan)的功能过于强大一样,在我看来也存在类似的风险(我希望Python永远不会获得如此强大的宏系统, “让人们定义自己的语言中嵌入的他们自己的特定领域的小语言”的诱惑力很重要-恕我直言,这会通过向可能的修补匠提供“有吸引力的麻烦”来削弱Python对应用程序编程的出色用处。潜伏在每个程序员的心中...)。
亚历克斯