过去几天我一直在阅读很多关于Ruby的内容。我遇到的所有SO帖子都听说ruby是一种优雅的语言。你们能举个例子说明为什么红宝石比另一种语言更优雅?
答案 0 :(得分:17)
它被认为是优雅的,因为它是正交。这是一种奇特的说法,类似的操作适用于类似的操作数。
简单示例:整数上的+
添加它们;关于浮点数,同上。在大整数上也是如此。在字符串上,它连接它们(你也期望它)。现在这对于+
来说并不是什么大不了的事,你可以从任何体面的编程语言中得到它。但是有像map
或filter
这样的操作,它们在列表上工作(它们应该!)但是它们也可以在数组上工作,实际上可以在任何可以枚举或迭代的事物上工作。
我喜欢数组(或列表)索引的工作原理,你可以使用正整数索引从开始索引,或者用负索引来指定从结构末尾开始的位置,你可以指定一个范围来拉出一个子集...这也适用于列表,数组和(子)字符串。它适用于赋值的右侧(=
),它也适用于左侧(您可以分配给子串,从而替换部分字符串)。因此,您不需要substring_replace
函数,只需利用现有的一般概念。
Ruby的作者在满足用户(即程序员)的期望方面表达了这一点:应该尽可能少的意外,只要常识会让你期望某些东西以某种方式起作用,它应该只是应该。他非常努力地满足这一要求。此外,虽然Ruby从Perl借了一点点,但作者不赞同Perl的TMTOWTDI原则支持Python的禅:“应该有一个 - 最好只有一个 - 显而易见的方法。”
Ruby执行闭包(=代码块)也很好,因此您可以通过将其包装在一对大括号中来指定函数。有些地方适合指定内联函数,而Ruby可以让你方便地完成它。
Ruby允许您使用少量编码来执行操作,因为它的构造以强大的方式组合在一起。我涉足Project Euler,我发现通常最短的易读且可理解的解决方案都是在Ruby中完成的。最短的是在J,但这是一种APL方言,对于不熟悉的人来说,它看起来像线路噪音。
我的个人经历证实了这一点:我自学了Ruby和Rails,并在一周内编写了一个带有中等复杂数据分析的Web应用程序。我学到的每一个原则,我都可以在不同的地方申请不同的数据 - It Just Works™!
答案 1 :(得分:5)
答案 2 :(得分:5)
根据我的经验,积木是使Ruby变得优雅的最大因素。什么比写每个迭代数组/哈希/等更优雅...
arr = ["one", "two", "three"]
arr.each { |e|
puts e
}
但是我相信它不仅仅是这个,Ruby语言的优雅也来自于库。大多数库都一直使用独特的Ruby'style'作为函数名,例如'each'用于迭代或使用'!'和'?'在破坏性/布尔返回函数的函数名称末尾,这就是真正保持Ruby'优雅'的原因。
答案 3 :(得分:4)
来自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
答案 4 :(得分:4)
Ruby完全关注生产力和编程乐趣,但是有几个原因可以解释为什么Ruby优雅:
以上所有内容的总和是使用Ruby可以:
因此具有可读且简洁的代码 - &gt; 更少的代码来编写 - &gt; 更少的代码来测试和维护 - &gt; <强>生产率强>
我不应忘记提及Ruby背后的支持性社区。 strong>
答案 5 :(得分:2)
我可能无法证明它很优雅,我认为一般来说优雅是由程序员的实现得出的。不过我可以说它很简洁,我认为当他们说Ruby优雅时,很多人都会感受到这种感觉。通常快速汇总的代码会感觉很优雅。
您可以看到编程语言枪战here的结果。你会注意到Ruby 1.9在左侧是平坦的,这意味着它非常简洁。我敢打赌,任何谈论优雅语言的人都在谈论一种左侧或近侧的语言。 Haskell是我所知道的唯一值得注意的例外之一,它需要付出很多努力来完成某些事情,但仍然感觉非常优雅。
答案 6 :(得分:1)
everthing是一个对象(ps。就像在smalltalk中一样..):
3.times { p "olleh" }
可扩展/开放类(例如来自Rails):
10.days_ago
..更多关于红宝石的优雅:http://www.benhughes.name/files/presentations/ruby_elegance.pdf
答案 7 :(得分:0)
只是一个有趣的旁注:this feels like php还是Ruby(从今天早些时候开始),但第一个答案感觉就像优雅的Ruby。在PHP中,我最终编写了像链接帖子这样的愚蠢的长代码来做一些小事情。部分原因是基本上不存在lambda。所以我不得不说Ruby的lambda支持与map / reduce一起使我优雅。