Ruby的`end`分隔符是多余的吗?

为什么需要在Ruby中编写end分隔符? 是否可以从缩进中解释,如Python或CoffeeScript?

 class String COLORS.each do |color,code| define_method "in_#{color}" do "#{self}" end end end 

对我来说看起来好多了

 class String COLORS.each do |color,code| define_method "in_#{color}" do "#{self}" 

如果没有,将来是否可能或有任何变通方法? 是否有任何编译成Ruby的语言(如CoffeeScript编译成JS)?

在Ruby中,空间并不重要。 因此,需要清楚地标记代码块的开始和结束位置。

如果这看起来像你的语法开销,那么你应该看看Python :)( 我不喜欢它正是因为这个原因:重要的空格

原因只是语言设计师的品味(从Matz开始)。 许多人只是不喜欢基于缩进的语言。 鉴于此,有趣的是,其中一些(如HAML或Coffeescript)在更大的Ruby世界中certificate是相当成功的。

然而,Ruby本身可能永远不会基于缩进。 如果您想使用具有该function的通用语言,您应该查看Coffeescript(编译为Javascript)或Python。

这是语言设计的选择。 如果您喜欢基于空格的块分隔符,请使用Python。

我同意它是多余的,但目前唯一的方法是使用括号(我猜你会同意这更可怕):

 class String COLORS.each { |color,code| define_method "in_#{color}" { "#{self}" } } end 

如果Ruby注意缩进,可以从缩进中推断出来。 今天大多数流行的语言,Python是一个很大的例外,没有语义上显着的缩进。

有些语言正是这样做的(特别是Haskell和Python),但不足之处在于,像这样规范化缩进更加尴尬,因为冗余信息较少。 这也意味着使用标签与空格将成为重大的圣战问题,而不仅仅是个人偏好(以及下class后在酒吧中的讨论)。