2

我目前正在阅读 Ruby。我认为它是一门不错的语言,但我对有这么多相同的方式感到有点困扰,这些方式在语法上只是略有不同,用于编码相同的动作。例如unless conditional语句,它完全等同于写作if !conditional

对我来说,这并没有增加任何表达能力,只是让遵循其他人的代码更加费力。有没有我错过的好处(除了迎合不同的口味,我觉得这没有说服力,因为人们通常不会因为某些句法关键字不符合他们的口味而拒绝一种语言)?

可能在每种语言中都有更多这样的例子。我只使用这个例子是因为我认为它特别缺乏合理的辩护。

4

4 回答 4

3

迎合不同的口味是可能的解释。这种哲学是从 Perl 改编而来的,它被称为TIMTOWTDI(有不止一种方法可以做到这一点)。

这确实有一些优势,例如它有助于在 Ruby 中创建丰富的特定领域语言,因为现有的语法结构可以以新的、有趣的方式组合。

但这种技术也有很多批评者,Python 尤其反对

应该有一种——最好只有一种——明显的方法来做到这一点。

于 2011-02-13T09:14:25.140 回答
1

Perl 也有一个“除非”结构,我相信它源于拉里沃尔作为语言学家的背景。

如果我们能够在心理上快速确定语义,则分支结构更容易理解,例如,采用这样的双重否定:

  if (!$isDisabled)
  {

  }

导致我虚弱的大脑跳过一个节拍“所以,如果没有禁用......等等......对,那么如果启用?”

unless可以使它更像自然语言

  unless($isDisabled)
  {

  }
于 2011-02-13T09:14:07.727 回答
1

不同的句法变化可以在不同的时间更方便和容易阅读。对于开发人员来说,它是一个有用的工具,可以为特定任务选择最易读和最明显的语法。

这可以显示为您的unless示例:

对于一个简单的布尔表达式,使用除非或如果没有真正的优势,尽管可能会有个人偏好,具体取决于特定开发人员认为它看起来有多好:

if !my_bool_var
    #
end

unless my_bool_var
    #
end

这些同样易于阅读(和编写)。

但是,对于更复杂的布尔表达式,该if形式有缺点:

if !((a + b + c) < (x-a)*b && my_bool_var || ((x - a)*b)/(c+1) > 2)
    #
end

unless (a + b + c) < (x-a)*b && my_bool_var || ((x - a)*b)/(c+1) > 2
    #
end

在这里,除非形式更容易阅读,因为我们确定 not 适用于整个表达式,而对于 if 形式,我们必须在视觉上匹配括号,这在如此复杂的表达式中可能很难,尽管语法突出显示在编辑器中对此有所帮助。

于 2011-02-13T12:23:36.320 回答
0

一般来说,为开发人员提供多种方式来实现相同的事情是很正常的,当然,选择一种方式而不是另一种方式是某种开发人员的偏好。但是您必须知道,当智能编译器将代码转换为其二进制执行格式时,它会将所有方式转换为相同的结果。

于 2011-02-13T09:12:20.570 回答