编写Ruby而不添加“end”的任何方法?

时间:2011-12-25 03:15:21

标签: ruby syntax

Ruby是一种优美的语言,但有一个关键词“结束”,我讨厌写很多次。 有没有什么方法可以编写简洁的代码而不必每次都写“结束”?

2 个答案:

答案 0 :(得分:10)

好的,这部分是无响应的,但最初,begin ... end是范例。而最初,我的意思是你或我从未见过的语言;像 Algol这样有趣的名字。有些语言(FORTRAN,Basic)多年来只有单一语句条件错开。

然后是C,后来,Java出现并接管了这个世界。他们有 {..}。,这也不错。

Python和其他一些(包括我在Python发明之前几年写过的微代码汇编程序)已经使用使用缩进来实现块结构。很好的解决方案,但显然它并不是那么流行。

所有这些都在工作,但存在各种问题。

信不信由你,Ruby的语法设计毫无疑问地考虑了所有这些其他不太完美的死胡同。

我的建议是:再给它一次机会就像它一样。

Ruby将开创性和技术上崇拜的SmalltalkLisp与实用且实际有用的Perl.合并。无论出于何种原因,Smalltalk和(((Lisp)))都没有成功大约30年和55年,Perl正在褪色。 Ruby是迄今为止最流行的最先进的语言。

未来是Ruby(以及Python和JavaScript)和人们喜欢Ruby有一个原因。其中一个原因是真正用户友好的语法。

相信我,替代方案更糟糕。

继续尝试!

答案 1 :(得分:6)

实际上你根本不需要编写end来编写Ruby:

Foo = Class.new {
  define_method(:bar) {
      puts "I don't recommend this"; \
      return 42 \
    if (:what_is_going_on?)
  }
}

Foo.new.bar # => 42

期待其他Rubyists阅读您的代码,想知道您的想法是什么,但是......

另一种可能没有任何end用你最喜欢的角色取代所有可怕的end的可能性:

# encoding: utf-8

define_singleton_method(:_){|code|
  eval(code.gsub("◊", "e\156d"))
}

_ <<-EOC
  class Foo
    def bar
      if :what_is_going_on?
        puts "I don't recommend this either"
        return 42
      ◊
    ◊
  ◊
  p Foo.new.bar  # => 42
EOC

或者用您自己的解析器替换_,该解析器根据缩进生成end个!