2009-11-28 94 views
12

过去几天我一直在阅读很多有关Ruby的文章。每遇到一个我遇到的SO帖子,我都会听说Ruby是一种优雅的语言。你们可以举一个例子,说明为什么红宝石比另一种语言更优雅?Ruby是一种优雅的语言吗?

+0

类似:http://stackoverflow.com/questions/1589841/what-does-it-mean-when-someone-says-that-perl-is-more-expressive-lanaguage – 2009-11-28 13:39:14

回答

17

它被认为高雅的,因为它是正交。这种说法类似的操作适用于类似的操作数。

简单示例:+整数加起来;在浮点数上,同上。大整数也是。在字符串上,它将它们连接起来(这也是你期望的)。现在这对于+并不是什么大事,你可以从任何体面的编程语言中期待它。但有些操作像mapfilter,他们在列表上工作(他们应该!),但他们也在数组上工作,事实上在任何可以枚举或迭代的东西上工作。

我喜欢数组(或列表)索引的工作方式,可以使用正整数索引从开始索引,也可以使用负索引指定从结构尾部返回的位置,您可以指定一个范围来取出一个子集...这适用于列表,数组和(子)字符串。它在作业的右侧工作(=),它也在左侧工作(您可以分配给子字符串,从而替换部分字符串)。所以你不需要substring_replace函数,你只是利用现有的一般概念。

Ruby的作者在满足用户的期望时表达了这一点:应该有尽可能少的惊喜,只要常识会导致你期望某件事以某种方式工作,它只是简单的应该。他非常努力地满足这个要求。另外,虽然Ruby从Perl中借鉴了一点点,但作者不同意Perl支持Python的Zen的原理:“应该有一个–,最好只有一个明显的方法来做到这一点。”

Ruby不会闭包(=代码块),所以你可以简单地通过将它包装在一对大括号中来指定一个函数。有些地方适合用inline指定一个函数,而Ruby可以让你方便地执行。

Ruby允许你用少量的编码来做事情,因为它的构造以强大的方式组合在一起。我涉足Project Euler,我发现通常最短的解决方案是在Ruby中完成的易读易懂的解决方案。最短的是J,但这是APL方言,对于外行来说,它看起来像线路噪音。我个人的经历证明了这一点:我自学Ruby和Rails,并在一周内编写了一个中等复杂数据分析的Web应用程序。我学到的每一个原则,我可以用不同的数据在不同的地方申请– It Just Works ™!

+0

免责声明:我在上面的答案中可能会模糊细节,因为我目前没有积极使用Ruby。如果我有什么问题,请告诉我,我会解决的。几年前,我喜欢红宝石的优雅,但因为参考实现过于缓慢而关闭了。与此同时,JRuby的速度与Java一样快,我会为下一个项目考虑这一点。 – 2009-11-28 12:16:20

+4

计算环境中的正交表示没有副作用,因此,例如,修改一个组件不会影响相关组件。 – 2009-11-28 12:18:05

+1

维基百科:“如果任何指令可以在任何寻址模式下使用任何寄存器,则指令集被认为是正交的。” - 这就是我正在讨论的内涵。我同意这不是完全明确的,这就是为什么我必须跟进很多挥手的话语。 – 2009-11-28 12:27:17

1

寄托都是一个对象(PS等在Smalltalk ..):

3.times { p "olleh" } 

可扩展的/打开的类(例如,从滑轨):

10.days_ago 

..更加上红宝石优雅http://www.benhughes.name/files/presentations/ruby_elegance.pdf

+0

嗯..我想知道这是什么代码的和平呢? – Luke101 2009-11-28 10:57:40

+2

因此smalltalk也很优雅? – 2009-11-28 11:02:20

+0

@ Luke101:它打印3次“olleh”。 – sepp2k 2009-11-28 11:07:02

4

Ruby和DSL的一直discussedalot。从sinatra

例子:

get '/' do 
    'Hello world!' 
end 

或从本blog

ChessGame.new do |move| 
    move.black_pawn(forward) 
    move.white_pawn(forward) 
    #… 
    move.white_queen(pwn_king) 
end 
5
  • 公开课即他们定义
  • 的method_missing即办案那里你发送消息的可能性后,你可以添加方法的类还没有定义的方法对于。这又可以让你编写适应而不是崩溃的代码。
  • 具有Smalltalk-like,一致的OO型号例如,你可以做1.class 1.times {}之类的事情。这使得很多DSL支持成为可能。
  • 块/密封件 - 使得它更容易编写灵活的代码
  • 不与静态类型每个变量的(即试图解决不属于重要的,如果问题浪费你的时间你做TDD)
  • 您没有使用基于类的OO即它支持基于原型的面向对象编程
2

我可能不能认为它是优雅的,我认为,在一般优雅是由程序员的impl派生的ementation。不过,我可以争辩说,它很简洁,我认为这是很多人在说Ruby很优雅时真的感觉到的。很多时候,汇集在一起​​的代码很快就会变得优雅。您可以看到编程语言枪战的结果here。你会注意到Ruby 1.9在左侧被打平,这意味着它非常简洁。我敢打赌,任何人谈论一种优雅的语言都是在谈论一种左侧或接近的语言。 Haskell是我知道的唯一值得注意的例外之一,它需要花费很大的努力才能完成某些工作,但仍然感觉非常优雅。

+1

如果你想专注于Code-used,你可以为自己的排名设置自己的参数 - http://shootout.alioth.debian.org/u32/fun.php?d=data&calc=calculate&xfullcpu=0&xmem=0&xloc= 1 binarytrees = 1&chameneosredux = 1&fannkuch = 1&FASTA = 1&knucleotide = 1&天壤之别= 1&流星= 0&nbody = 1&pidigits = 1&regexdna = 1&revcomp = 1&spectralnorm = 1&threadring = 0 – igouy 2009-12-01 16:01:17

5

在我的经验中,块是促使Ruby优雅的最大因素。有什么比写每个来遍历数组/哈希的/ etc更优雅......

arr = ["one", "two", "three"] 
arr.each { |e| 
    puts e 
} 

但是我相信这是比这更多,Ruby语言的优雅也来自库。大多数图书馆一直使用独特的Ruby风格来表示函数名称,比如'each'用于迭代或使用'!'和'?'在破坏性/布尔返回函数的函数名的末尾,这是真正保持Ruby'优雅'的原因。

4

红宝石是所有关于生产力和编程的乐趣,但有几个原因,Ruby是优雅:

  • 纯OOP:一切都是对象,所以你没有原始的区分和对象类型。
  • 它支持Functional和Imperative编程范例:导致简洁和可读的代码。
  • 它支持Principle of Least Surprise:它支持可读性。
  • 它有关闭和块:这对于做Internal DSLs真的很酷。
  • 它有一个强大的Metaprogramming API:它也授权编写内部DSL。
  • 它非常擅长编写脚本任务:处理文本和XML文件以及处理与管理相关的事情(现在它已被系统管理员广泛使用)。
  • 它有一个非常酷和支持性的社区:无论你的问题是什么,你都会找到支持和帮助。该社区支持现代和时尚编码技术,如TDDBDD

上述所有的总和是用Ruby,你可以有:

  • 简洁的代码:相较于Java和C++,至少可以节省自己的代码输入的50%。
  • Readablility。

因此具有可读和简洁的代码- >更少的代码编写- >更少的代码测试和维护- >生产力

我不应该忘记提及Ruby背后的伟大支持社区。

0

只是一个有趣的一面注:this feels like php还是Ruby(来自今天早些时候),但第一个答案感觉就像优雅的Ruby。在PHP中,我最终写了像链接文章这样的愚蠢的长代码来做一些小事。部分原因是因为lambda基本上不存在。所以我不得不说,Ruby的lambda支持与map/reduce一起使得它对我来说很优雅。

相关问题