开发者比较Ruby与Python:两者惊人相似,语法差异无关紧要
来源标题:What's better about Ruby than Python? (2003)
一位开发者在OSCON参加Dave Thomas的Ruby教程后认为,Ruby与Python在表层语法之下惊人相似,语言选择不应纠结于语法细节。他指出Ruby需要写end而Python需要写冒号,两者几乎抵消,@foo与self.foo、大小写敏感度等差异对自己无关紧要。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
可能,也可能不,取决于一个人的目的——例如,如果目的是对Python社区进行“社会学研究”,那么向该社区提问,可能比在别处提问更能揭示关于它的信息:-)。就我个人而言,我很高兴在上一届OSCON上抓住机会参加了Dave Thomas为期一天的Ruby教程。在语法差异的薄薄表层之下,我发现Ruby和Python惊人地相似——如果我是在几乎任何一组语言中计算最小生成树,我很确定Python和Ruby会是头两个合并成中间节点的叶子:-)。当然,在Ruby中,我确实厌倦了在每个块末尾键入那个傻乎乎的“end”(而不是仅仅取消缩进)——但这样一来,我也避免了键入Python在每个块_开头_所要求的同样傻乎乎的“:”,所以这几乎扯平了:-)。其他语法差异,比如“@foo”对“self.foo”,或者Ruby中大小写比Python中更重要,对我来说其实差不多同样无关紧要。其他人无疑会根据这类问题来选择编程语言,并且它们会引发最激烈的辩论——但在我看来,这不过是帕金森定律在起作用的一个例子(一个问题上的辩论量与该问题的实际重要性成反比)。有一个语法差异我确实认为重要,并且对Python有利——但其他人无疑会认为恰恰相反——那就是“你如何调用一个不接受参数的函数”。在Python中(就像在C中一样),要调用一个函数,你总是应用“调用运算符”——紧跟在被调用对象后面的尾随括号(在这些尾随括号里放的是你在调用中传入的参数——如果你不传参数,那么括号就是空的)。这就使得仅仅提及任何对象、不涉及任何运算符时,只意味着对该对象的引用——在任何上下文中都是如此,没有特殊情况、例外、临时规则之类的东西。在Ruby中(就像在Pascal中一样),要调用一个带参数的函数,你传入参数(通常在括号中,尽管并非总是如此)——但是,如果函数不接受参数,那么仅仅提及该函数就会隐式调用它。这可能符合许多人的期望(至少无疑符合那些先前唯一的编程经验是Pascal或其他具有类似“隐式调用”的语言,比如Visual Basic的人)——但对我来说,这意味着仅仅提及一个对象可能要么意味着对该对象的引用,要么意味着对该对象的调用,取决于对象的类型——而在那些我无法仅仅通过提及对象就获得对该对象引用的情形中,我将需要使用显式的“给我对这个的引用,不要调用它!”运算符,而这些运算符在其他情况下是不需要的。我觉得这影响了函数(或方法,或其他可调用对象)的“一等公民”地位,以及平滑互换对象的可能性。因此,对我来说,这个特定的语法差异是Ruby的一个严重污点——但我确实理解为什么其他人会持相反看法,尽管我几乎不可能更激烈地不同意他们:-)。在语法之下,我们进入基本语义上的一些重要差异——例如,Ruby中的字符串是可变对象(像C++中那样),而在Python中它们是不可变的(像Java中那样,或者我相信C#中也是)。同样,主要根据自己已经熟悉的东西来判断的人可能会认为这是Ruby的一个加分项(当然,除非他们熟悉Java或C#:-)。我嘛,我认为不可变字符串是个极好的主意(而且我并不惊讶Java——我认为是独立地——重新发明了这个已经在Python中存在的理念),尽管我也不介意有一个“可变字符串缓冲区”类型(理想情况下还要比Java自带的“字符串缓冲区”更易用);而我做出这个判断并不是因为熟悉——在学习Java之前,除了那些_所有_数据都不可变函数式编程语言之外,我所知道的所有语言都有可变字符串——然而当我第一次在Java中看到不可变字符串这一理念时(我学Java远早于学Python),它立刻让我觉得极好,非常适合高级编程语言的引用语义(相对于最适合更接近机器、远离应用的语言(如C)的值语义),而字符串作为一种一等的、内置的(而且相当关键的)数据类型。Ruby在基本语义上确实有一些优势——例如,去掉了Python中“列表vs元组”那个极其微妙的区分。但总体而言,比分(按照我的记分方式,简单是大大的加分,而微妙、巧妙的小区别是显著的减分)对Ruby不利(例如,同时有闭区间和半开区间,记法为a..b和a...b[有谁想声称哪个是哪个是_显而易见的_吗?-],这很傻——当然,这是我认为的!)。同样,那些认为在语言核心中拥有许多相似但微妙不同的事物是加分而非减分的人,自然会以与我相反的方式来计这些分:-)。不过,别被这些比较误导,以为这两种语言_非常_不同。它们并非如此。但是,如果我被要求把“capelli d'angelo”与“spaghettini”作比较,在指出这两种意面对任何人来说几乎无法区分、并且在你可能想做的任何菜肴中都可以互换之后,我接下来就不可避免地要进入对它们的长度和直径如何难以察觉地不同、一者的面条末端如何渐细而另一者不是等等的微观考察——试图解释为什么我个人在任何汤中都宁愿用capelli d'angelo作为意面,但在搭配适合这种长细意面形态的合适酱汁(例如橄榄油、蒜末、红椒末和细磨凤尾鱼——但如果
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。