Rails Ruby 的名气是不是 Rails 带来的?

boardsky · 2012年05月22日 · 最后由 bhuztez 回复于 2012年06月02日 · 9531 次阅读

别人都说是 rails 写得好,没怎么听说 ruby 写的好,从使用趋势来看 ruby 正在走下坡路!

如人饮水,冷暖自知。 别人说的桃子再甜,杏子再酸。都是别人的感受。你的感受呢?

ROR 的学习成本太高了,每更新一个版本都存在不兼容性的问题,悲催!

神奇的是,曾经有无数的语言模仿 Rails,但他们也重来没法造出一个真正的 Rails,这都是 Ruby 的特点。

#3 楼 @huacnlee 太对了,就是这样的。

要说 rails 就偏颇了,国内第一波 ruby 热绝对是 RPG 游戏制作大师带起来的......... 话说,这算不算冷笑话.........

#5 楼 的科普让我知道长知识了

#5 楼 @clearJiang 大大求科普链接

#5 不明白你讲的是什么意思,ruby 跟 RPG 游戏有关,求链接?

我原先接触 ruby 就是用 RPG maker 来的。不过完全没有体现出 ruby 的威力。后来就放手了。

我招聘时从来只说要 ruby 程序员,从不说要 rails 程序员。如果只会写 rails,对 ruby 其他的用法不了解的话,太狭义了。:)

去日文版 wiki 了下“RPG ツクール”(也就是 RPG 游戏制作大师),看到这个软件里面支持的一个叫做 RGSS 的开发语言,这东西也就是以 Ruby 语言为基础的游戏脚本语言(RGSS 的缩写就是 Ruby Game Scripting System),具体情况各位自己去 wiki 去吧

btw:该词条有中文版本

匿名 #13 2012年05月22日

没说 Ruby 写的好?我记得看过一个亚马逊的大牛写过个评论各种语言的,他认为现在最好的语言就是Ruby。 名气的话我觉得说是最初由 Rails 带来的也行吧。

#8 楼 @boardsky #7 楼 @pokkalee

嗯,就是 RPGMaker,游戏逻辑是通过 ruby 做脚本嵌入的,我记得似乎装好后还内含一本 ruby api 的 chm. 国内一些游戏论坛和搞同人游戏的可劲的折腾过这东西

这种帖子,还是等楼主真正了解了 Rails 以及 Ruby 之后再发比较好。

Rails 的优势是由 Ruby 带来的

不明白讨论这样的问题有什么意义。。。

其实讨论这个问题有什么意义...

#3 楼 @huacnlee 这个回答精辟,rails 毕竟是基于 ruby 语言的 web 框架

别人都说是 Rails 写得好,没怎么听说 Ruby 写的好。

楼主其实应该琢磨下自己帖子中这句话其中的思辨。

  1. Rails 写的好,是用 Ruby 写的。
  2. Ruby 是用别的语言写的,好不好其实无所谓,语言的定义已经是 ISO 标准,一个实现不好还有别的。
  3. 就像 @huacnlee 说的,Rails 一直被模仿,从未被超越。Ruby 的话在语言界,语言界的特点是综合借鉴多种其它语言来创立新语言,很少以模仿并超越为主要目的的语言。

我的观点就是,一个语言好不好,就得看用它开发出来的东西好不好。比如 Ruby 开发出的 Rails 很好。除了 Rails 还有一大堆其他的优秀 Gem。

Ruby 写的好与不好,他是用 C 写的,写的好不好能得出的结论底是 C 好不好,还是 Ruby 不好?

另外,

从使用趋势来看 ruby 正在走下坡路!

这个趋势跟下坡路不知从何得来,而且上坡路下坡路对个人发展影响不大,VB 牛人现在一样可以找到工作 (当然不是小瞧 VB,教中小学 VB 也是工作)。

我觉得吧,ruby 的语法功能有些冗余,往好处说叫方便,往坏处说叫凌乱,有些方法 (函数) 用其他的两个方法 (函数) 很容易组合实现,但 ruby 还是提供了

学 python 的时候学到列表、切片,甚至都感觉不到这个知识点的存在,但确实可以用它做很多事情。list[:]、list[m,n]、list[m]、list[:m]、list[-m:] 很简单很容易理解的写法,但几乎可以做列表切片相关的所有事情,把复杂的问题简单化

ruby 的数组,方法就比 python 多多了,是一种方便,也是一种负担。提供了 slice 方法就不用再提供 first、last 了,就算不省略 first,省略 last 总可以吧。array.reverse.first(n).reverse 就能达到 last(n) 的效果

这只是举其中一个例子,用 ruby 的时候确实要经常仔细斟酌该通过哪一个途径

#21 楼 @gaicitadie 我想,要实现last(n)的话是不是这样写会比较好

class Array
  def last n
    self[-n, n]
  end
end

@gaicitadie 你觉得 array.reverse.first(n).reverse 用起来比 array.last(n) 好多了是吧

#23 楼 @feipinghuang first、last 都不该存在用 array[0...n]、array[-n..-1] 代替 恩,还是 python 的写法更优美: array[:n] array[-n:]

既然 ruby 在数组中提供了 first、last 方法,为什么在字符串中又不提供了呢?字符串本质上就是单个字符组成的数组,就算不是,把字符串理解成单个字符组成的数组也更容易解决问题 还是 python 对数据的理解更透彻: str[:n] str[-n:]

#25 楼 @gaicitadie 没啥区别吧,把 Python 代码改成 Ruby,只是把竖着两个点变成横着,Ruby 难道不能 a[1..] a[..-1] ?

#27 楼 @bhuztez 不能,并且为了让 n 等于被截取字符串的长度,需要 array[0...n] 从 0 开始,array[-n..-1] 以 -1 结束,array[0...n] 里面是 3 个点号,array[-n..-1] 里面是 2 个点号,从美观和易记上比 python 差远了。但在 ruby 中只有这样才是 str 和 array 通用的

匿名 #29 2012年05月30日

str 为啥要做到 array 一样,如果一样为啥还要有 string?array 的这两个接口明显是为了队列和栈这种结构准备的吧,ruby 中的数组不仅仅是数组。美观每个人的角度都不同,不过你要说 python 那种易记的话至少我不敢苟同..

字符串'abcdefg'每隔一个字符,python 中只需要这样切片'abcdefg'[::2] 即可返回'aceg',ruby 怎么实现?

#21 楼 @gaicitadie 你是站在 python 的角度来看 ruby,所以就永远没有办法领会 ruby 冗余的精髓。
python 和 java 的设计思想是很类似的,就是标准化,一致化,一个功能最好就一个实现方式。
这样是有好处的,可以让大规模的协作编程更容易,但同时丧失了灵活性和创造性。
ruby 的初衷是 coding for fun,可以让程序员更容易更有趣的编程,更加的灵活,更加的符合人类语言的规则。
自然语言本身就是冗余的。表达同一个意思也会有不同的词汇。就像 ruby 中有 size(),也有 length(),有的人习惯用 size(),有的人习惯用 length(),没必要限定到一个上来。
而且 ruby 的这种冗余不但没有让程序可读性变差,反而变的更好,更符合人类的阅读习惯,从“诗歌体”上就能看出来。
在这种 coding for fun 的精神的领导下,ruby 社区一直都是在追求好用的 API,流畅的 DSL,使得编程愈加的人性化。

匿名 #32 2012年05月30日

#30 楼 @gaicitadie 这种需求和特性没有到值得拿出炫耀的地步吧?随便找点 Ruby 可以一行解决的来问你 python 是否 OK?而且 [] 只是个方法,大不了我可以自己定义这些,这个就是对你来说 python 优于 Ruby 的理由? "abcdefg".gsub /(.).?/,'\1'

字符串本质上就是单个字符组成的数组,就算不是,把字符串理解成单个字符组成的数组也更容易解决问题

针对这个,python里面的数组有个sort方法,为啥字符串就没有呢

#33 楼 @ywjno python 的 list.sort 相当于 ruby 里的 Array.sort(_by)! ; sorted(list) 相当于 Array.sort(_by) 而 python 的 str 是只读的,并不允许改变自身,于是 str.sort 这个就不存在了.....

#34 楼 @clearJiang 原来如此,多谢指点了

#31 楼 @bony

是的,而且 Ruby 有很多名字不同做到的事情完全一样的方法,比如 map 跟 collect

ary.map {|x| x*x } 是类似于函数式语言,把一个 lambda map 到里面去。

ary.collect(&:name) 或者 ary.collect {|x| x.name} 是把元素的 name 属性 collect 出来。

Ruby 跟 Python 语言的哲学就不一样。

Python: There should be one-- and preferably only one --obvious way to do it. Python 讲究只有且最好只有一种而且最明显的解决方式

而 Ruby

Ruby inherited the Perl philosophy of having more than one way to do the same thing.

—Yukihiro Matsumoto (Matz) , The Philosophy of Ruby

所以 @gaicitadie 在讨论 Python 跟 Ruby 谁好谁坏之前,我们得先讨论哲学。

在我看来,一个人的哲学观点就来自于这个人的人生观,世界观,价值观。

如果你喜欢 一个问题 只有且最好只有一种 解决方法,那么 Python 当然会适合你的思维。

而我,一直都觉得 事固有违经而合道,反道而适权者 这话很有道理。同一个问题或者物体都有多面性,不同的情况可以用不同的方法来实现同样的事情,所以 Ruby 适合我的思维。

如果抛开语言设计的这些哲学思维来对比两个语言,就好像你喜欢宝马,在嘲笑路虎的底盘太高,喜欢 曼联 揶揄 湖人 队员太少一样。

呵呵,没说 python 不好,喜欢哪个就用哪个。就像 vim 和 emacs, 宝马和路虎。

Ruby 的哲学——与 Yukihiro Matsumoto 的对话:

 Ruby程序设计语言的发明人Yukihiro Matsumoto与Bill Venners进行了一次谈话。谈话内容集中讨论了Ruby的设计哲学,包括设计的不完整性,正态危险性,以及人类在计算机科学发展商的重要作用。

    在网络上以昵称"Matz,"著称的Yukihiro Matsumoto是Ruby程序设计语言的发明人。Ruby是一种适于开发日常脚本以及完整的应用程序的面向对象程序设计语言。Matz自从1993年就开始进行了Ruby语言的研发工作。因为他想发明一种语言使得你既能非常高效的进行开发又感觉到乐趣无穷。最开始Ruby只是在日本非常流行,随后便踏上了进入了全世界程序设计者心扉的道路上。

    2003年9月24日Bill Venners与Yukihiro Matsumoto在丹麦Aarhus 举行的JAOO会议上会面。在这次会面上,Yukihiro Matsumoto讨论了Ruby的设计哲学,Ruby程序设计语言的特性,以及如何才能成为一个更好的程序员。在这部分当中,Matz特别介绍了设计的不完整性设计,正交的危险,运用向导提供程序设计的便捷,最小非预期理论,以及人在计算机发展上起到的重要作用。

没有完美的语言
Bill Venners:作为《Ruby程序设计语言:实践者的向导》的合著者,Dave Thomas告诉我你并不认为设计一种语言应当达到完美的境地,这是为什么呢?

Yukihiro Matsumoto:程序设计语言的设计者当然想要设计出完美的程序设计语言。他们想有这个能力说,“我设计的语言是完美的,它可以做任何的事情。” 但是设计一个完美的语言显然是不可能的,因为我们可以通过两种途径审视一门程序设计语言。第一种是审视这种语言都能够进行哪些工作。另外一种途径是审视当我们使用这种程序设计语言的时候我们的感觉是什么—也就是说在我们进行程序设计的时候有什么感觉。

Yukihiro Matsumoto:
    根据图灵先生的完整性理论,每一个图灵完整性语言所能够完成的工作都可以本另外一种图灵完整性语言所完成,仅仅是各种资源使用情况不一样。你可以在一个编译器当中做任何的事情。但现在没有人愿意在编译器当中进行程序设计了。从“你能做什么”的视角来看,语言的的确确是不同的—但是不同点是极其有限的。比如,Python和Ruby就为程序员提供几乎相同的程序开发功能。
    我不想强调这些“什么”,而我强调明这个“怎样”的部分:我们在进行程序设计的时候感觉怎样。这才是Ruby程序设计语言在设计上与其他语言的最大不同。我想特别强调一下感觉,我使用Ruby的感觉。我并不为了使Ruby被设计成每一个人都能感觉到非常舒适而潜心研究,因为大家的感觉和我一定是不一样的。没有一种语言能够完全适合每一个人。对于Guido van Rossum来说,Python可能是最适合他的了。

正交与和谐

Bill Venners: Dave Thomas还告诉我如果我向你建议增加一个特性将是一定会被反对的,你不会那样做的。你所想要的是和谐的设计,这是指什么?

Yukihiro Matsumoto:我相信一致性和正态性是设计的工具,但不是设计最主要的目的。

Bill Venners:在这里的“正态性”是指什么呢?

Yukihiro Matsumoto:正交性的一个例子就是允许任何的小特性和语法的组合。比如C++支持函数的默认参数值,并且可以对基于参数的函数进行重载。这两个特性在一个程序设计语言当中都是非常好的,但由于他们是正交的,你可以在同时应用它们。如果使用不明确,便一起就会标为错误。但是如果我观察代码,我首先也许要使我的大脑接受这样的规则。我要去猜测编译器是如何去工作的。如果我的想法是正确的,并且我足够聪明,这将是没问题的。但是如果我不是那么聪明,而且我真的不是,这就会造成混乱。结果将是一个普通人不能预期的。这就是正交性的缺点。

Bill Venners:换句话来说,正交特性只有在编译器的编写者明白他们并且能够让他们工作起来才会有效。但是对于程序员来说在面对正交特性的时候他们是很难理解的,因为这是极其复杂的,因为我必须辨明这两个特性是如何和谐的应用的。

Yukihiro Matsumoto:如果正交特性被组合,将会导致复杂性的发生。

Bill Venners:那么怎样选择呢?怎样做才能更和谐?

Yukihiro Matsumoto:仅仅选择两者之一集成在语言当中就可以了,你不必将你能够考虑到的所有事情都做一遍。你只需要选择一个,即使它们两个都很好。

自由与舒适
Bill Venners: Phython社区的设计哲学史提供并且仅仅提供一种方法去处理事情。如果你提供50种不同的方法去做同样的事情,那么你就提供给了代码编写者很舒适的方法。人们可以使用他们喜好的方式来进行程序设计。这个折中是在程序设计者中。当我阅读你的代码时你可能是用一种方法编写的。当我阅读另外一个惹得代码时,他们可能是利用其他的方法编写的。所以作为一个程序的阅读者,我为了完成这项任务就必须熟悉所有的方法,俄不仅仅是我自己进行程序编写的方法。这个是设计的折中。Phython社区看来是喜欢提供仅仅一种设计方法,但Ruby其实还是为处理同样的事物提供了多种方法。

Yukihiro Matsumoto: Ruby继承了Rerl的设计哲学,提供处理同样事物的多种方法。我从我心中的英雄Larry Wall那里继承了这个设计哲学。我想让Ruby的使用者感到随意。我想赋予他们选择的自由。人都是各不相同的。每个人都选择不同的标准。但是如果在多种选择当中有一个更好的方法,我将把它做的更为舒适,来支持这种方法。这就使我在努力进行的工作。或许Python的代码可读性更强。每一个人都可以书写同样风格的Python代码,以利于阅读,或许是这样。但是人与人之间的差别实在是太大了。即使你在使用Python,仅仅提供一种方式帮助微乎其微,我是这么认为的。在可能的情况下,我宁愿提供给用户多一些的方法,但是如果可能,我会鼓励他们或者指导他们选择一个个更好的方法。

Ruby的乐趣
Bill Venners:在Ruby的也介绍性文章中,你写道,“对于我来说,生活的意义有一部分是为了获得乐趣。程序员在集中精力于程序设计的创造性一方面的时候常会感到乐趣的存在。”那么Ruby是如何使程序员体会到乐趣的呢。

Yukihiro Matsumoto:你向往享受生活,不是么?如果你能很快地完成你的工作并且你的工作是充满乐趣的,那将是非常美好的,不是么?那就是生活的乐趣,当然是一部分,你的生活将变得更美好。

我会尝试用计算机解决我在日常生活中遇到的问题,所以我需要写程序。通过使用Ruby,我希望能够集中精力于我要做的事情,而不是语言那些不可思意的规则。就像以public void *** *** ***开始,来完成输出“打印 hello world”。我只想说,“打印这个!”我不想接触周围所有的魔术般的关键字。我只想集中精力于任务。这就使最基本的想法。所以我也已经试图使Ruby的代码简明清晰。

Bill Venners:允许程序员编写清晰简洁的代码是令他们愉快的一个方法。

Yukihiro Matsumoto:是的,所以他们可以集中精力于问题本身。有时候人们会将伪代码记在纸上。如果他们的伪代码能够在他们的机器上运行,这就是最棒的,不是么?Ruby就试图这样,就像运行的伪代码。Python社区的人们也这么说。

Bill Venners:是的,Python社区的人们的确是说Phython是可执行的伪代码。那么Ruby还有什么其他的地方使程序员感到高兴呢?

Yukihiro Matsumoto:在程序员的日常生活当中,我们会处理大量的文本串。所以我尝试了努力改善文本的处理,也就是string类和正则表达式。正则表达式被集成到这个语言当中,而且能够被和谐的应用。我们也许要深入操作系统进行调用。Ruby可以调用Unix和大部分的Windows API的每一个系统调用。这为解释语言环境带来了操作系统的强大功能。这样你就可以进行日常的系统管理和文本处理程序设计。这是我今生的主要工作领域,所以我尽最大的努力把它做的非常优秀。

Bill Venners:所以主要来说,Ruby帮助我快速地完成我的工作并令我感到很有趣,使得我尽情的享用我的生活。

Yukihiro Matsumoto:它至少是给了我这样的帮助,我不知道Ruby是否能为你带来这样的帮助,但我希望它能。

人的因素
Bill Venners: 在一个会面当中,你说,“不要低估人的因素。仅仅想到我们是在计算机之前,他们是媒介。我们正在与人在交流,为人类而工作。”你这样说又是为什么呢?

Yukihiro Matsumoto:设想你正在写一个email。你在一台计算机前,你在操作一台计算机,点击鼠标,在键盘上打字,但这些消息将要通过网络被传送到另外一个人那里。你虽然是在一台计算机前工作,但在计算机之后却是一个人。我们进行的大部分任务都是为人类而作的。举例来说,计算税就是数数,从而政府能够将我的钱从我的腰包掏走,但政府考虑的是人。

我们的大部分工作毕竟都是与人相关的。所以在程序设计中,我们不是让计算机为人类工作就是我们用十分清晰的方法将我们的想法描述给计算机从而使他能够执行。在第一种情况下,使计算机为人类工作,目标是计算机后的人。在第二种情况下,我们尽量清晰的像计算机表达我们的思想使得它能够明白并且能够执行,我们从我们的大脑中表达我们的意图,结果是计算机去执行。所以两种情况的对象都是人。

Bill Venners:这样思考的重要性是什么呢?你说,“不要忽略人的因素”,这是为什么?

Yukihiro Matsumoto:因为计算机并不介意我必须付出很大的努力与他们进行交流或者是我很容易就能与他们进行交流。他们并不关心我是将文件中无数的指令字节序列输给他们,使他们运行它,还是我使用高级语言转换指令。计算机是不关心这些的。但我们人类非常关心我们所付出的努力。通常人们,尤其是计算机工程师们,关注他们的机器。他们认为,“通过这样做,机器就能运行得更快。通过这样做,机器就会运行得更高效。通过这样做,机器就能怎样怎样。”他们关注的是机器。但是实际上我们需要将焦点聚集于人类身上,聚集于人类如何关注编写程序或者在机器上操作应用程序,我们才是主宰着,它们是奴隶。

Bill Venners:这只是暂时的。

Yukihiro Matsumoto:这只是暂时的,直到终结之时。

最小非预期理论

Bill Venners:在一次会面当中,你说“我设计Ruby来是我的惊讶最小化。我非常高兴全世界的人们告诉我Ruby减少了他们的惊讶,提高了他们对程序设计的乐趣。我现在非常肯定程序员们的思想在全世界都是很相像的。”为什么会有这样的最小非预期理论呢?

Yukihiro Matsumoto:事实上,我并不想声明Ruby遵循最小非预期理论。有些人认为Ruby的设计符合这个哲学,所以他们就开始这样说。事实上我并不这样认为。

我在程序设计中尽量的最小化我的挫折。所以我在程序设计中使我自己尽量不费劲。 这就使我在设计Ruby时的主要目标。我在自己进行程序设计时也喜欢享受乐趣。在发布Ruby并且世界上很多人开始了解Ruby之后,他们说他们感受到了我的感受。他们最终得出了最小非预期理论。但事实上,这经常会造成误导。

Bill Venners:又是造成怎样的误导呢?

Yukihiro Matsumoto:每一个人有不同的技术背景。有些人来自Phython社区,有些人可能来自Perl社区,他们可能为这种语言的不同方面感到惊讶。随后他们就来找到我说,“我对这种语言的这个特性感到非常惊讶,所以Ruby违反了最小非预期理论。”等等。最小非预期理论不是为你一个人设置的。它是在你非常好的掌握了Ruby以后的最小非预期理论。比如,我在开始进行Ruby设计以前是一个C++程序员。我专门进行C++程序设计两三年。在我进行C++程序设计两年以后,他还是经常使我感到惊讶。

http://blog.csdn.net/sunlen/article/details/1100475

@gaicitadie ruby 其实设计那么多繁琐相近的方法,也许是为了更好的让程序可读吧,有时候就是写过一边的代码,还会再改一遍,让程序像自然语言一样。例如‘[email protected]'.split("@")[0] 修改为"[email protected]".split("@").first。

匿名 #40 2012年05月31日

不敢苟同

以前会这么想,现在压根就不会那么想咯

#21 楼 @gaicitadie

嗨~ 我看出来了,XD 你是 Python 中毒太深了,所以觉得 Ruby 这也冗余,那也冗余。

这点我和你相似,不过我是 Ruby 中毒太深了。我只是嫌 API 不够多,从来不会觉得 API 太少。所以,当某个 API Ruby 没有提供,我就自己写。只要概念和方法足够统一,记忆这些东西对我来说没有压力。

举个例子:就像你后面帖子里面说的,针对字符串中单个字符的的 first 和 last. 其实 last 已经有了,只不过换了个名,叫做 chop, first 没有,所以我就加了个。只不过没用 first 名字,用了 lchop, 这是为了和 chop 统一。

而且 Ruby 是一门在逐渐完善的语言。他就是这样的风格,1.92 之前,还没有 singleton_class 方法呢。我也是自己实现,编辑器会自动加载。现在不是有了?

说白了还是风格问题,风格问题!

再多吐槽一句:

想讨论这个问题,咱可以单独开个贴。用这个贴讨论这个问题,第一是楼歪了 (严重歪了), 第二是:楼主的那一席话,实在不值得楼上各位为其解释。觉得 rails 好,就别 Ruby 就完了,觉得 Ruby 不好,用其他完了。

我来个鉴定:楼主是一个还处在 Ruby绝对小白阶段的愤青~

#26 楼 @gaicitadie

顺便再说一句:楼主的头像印象深刻。尤其是出来 Ruby'-china, 那个砸场子贴,那可真是掀起一场兴风血雨,直杀得你死我活,也没分出个胜负来。太过瘾了。可惜当时发现较晚,没有积极参与进来。遗憾啊遗憾!! 不知道什么时候楼主再来一场?我等一定多多捧场!!

#42 楼 @zw963 字符串的 first 与 last?str[0],str[-1] 不行么?chop 不是 last,而是切掉末尾取前半段哇

#36 楼 @hisea 我其实更喜欢 Python 的哲学一点,以前有张漫画,Python 大会大家都在讨论语言、实践、经验等等,Ruby Conf 则容易掐架,很多时候争执实现方式孰优孰劣真的没啥意义。

#45 楼 @dotnil 我个人觉得掐架才好,最早的时候左派右派的来历就是在法国,他们议政就是一伙在左边,一伙在右边,然后掐架。

现在左派右派反而成了贬义词了,好像中派才好,没了掐架,成了一言堂。

好像扯远了,不说政治。很多时候掐架讨论的,尤其是多种孰优孰劣的讨论,对于很多人尤其是新手来说,其实是个开阔思路的过程,每种方法的优劣都有正反两方说了,剩下的就是你自己理解加选择了。

反过来,去年我去 QCon,听了三个公司构架部署的演讲,Facebook, Netflix, 还有另外一个稍小点的公司,忘记叫什么了,大家说的都一样,都是类似的架构差不多的的部署方案,当然没什么不好,可能也说明这是目前最好的方案,但是对于抱着学习态度的我来说,稍微有些失望。。

#45 楼 @dotnil #43 楼 @zw963

其实 DHH 这个人我觉得很有意思,他就喜欢揶揄别人,可能很多人看他有些攻击性 (如果你 follow 他的 twitter 就知道了),可能导致人认为 Ruby 喜欢掐架。

我觉得最经典的是这个:https://www.djangoproject.com/snakesandrubies/

2005 年,他跟 Adrian Holovaty,Django 的创始人之一接受采访的视频。 我当时看感觉 Adrian 很谦逊,印象最深就是有一段。

Adrian 在介绍 Python 只有且最好只有一个解决方案的哲学的时候,就被 DHH 揶揄,说有且最好只有一个的话,为什么 Python 有那么多 Web Framework.

当时我觉得 DHH 太坏了。哈哈

不过后来我也经常揶揄身边用 Python 的朋友,有且最好只有一个最佳方案,那怎么 Python 有那么多版本啊。。。还互相不兼容。。。

#47 楼 @hisea DHH 只能说明 Rails 喜欢掐架。。你看 Matz 有多 nice 啊!

#48 楼 @hooopo 是其实 Rails 也不是那么爱掐架,Yahuda 我觉得也很 Nice. DHH 也没怎样,就是有点蔫儿坏,聪明人再蔫儿坏,就麻烦了。。

#48 楼 @hooopo #47 楼 @hisea

Matz 是一个优雅的绅士。太喜欢了。

#30 楼 @gaicitadie

顺便回复一个 Ruby 实现。我真佩服你。你提出的问题,看似简单,其实不简单哟。

字符串'abcdefg'每隔一个字符,python 中只需要这样切片'abcdefg'[::2] 即可返回'aceg',ruby 怎么实现?

"abcdefghi".chars.each_slice(3).inject("") {|a, x| a << x[0] }

这是我唯一想的出来的。我总觉得应该有更简单,或更直接的办法。例如判断数组索引是否奇数或偶数啥的,就是想不到,脑子卡壳了... 楼上两位有没有其他解决办法?给咱分享下,拓展下思路。

PS: 我头晕死了,二十多个小时没睡了。在倒时差。

#50 楼 @zw963 提供一个好邪恶的写法! 两个:

'abcdefghi'.gsub(/(.)(.)/, '\1')
 => "acegi" 

一个:

"abcdef".scan(/(.)./).join

#50 楼 @zw963 暂时想到一个对数组也可以切片的 s = "abcdefg" s.chars.select{|x|s.index(x)%2==0}.join #=>"aceg" a = [1,2,3,4,5,6] a.select{|x|a.index(x)%2==0} #=>[1,3,5]

#47 楼 @hisea Python 3.x 不向前兼容,是为了甩掉历史包袱,如果保持向前兼容,一次次的升级可能就会导致语言特性越来越臃肿,Python 用这种激进的方式保持 DRY

用不同的语言写代码心境真的不一样,用某种语言时间长了会塑造人的心态 (说塑造性格有些夸张),不同的心态又决定了制造出来产品的风格。有人说 python 很文艺,我觉得 ruby 更文艺一些,python 还是偏数学化,严谨到有点枯燥。如果做数据分析挖掘,用 python 更容易看透数据的本质。用别的语言的时候对多维数组、树的遍历这些概念有些犯怵,用了 python 以后这些数据的处理都变得很清晰了。

ruby 的块用起来很舒服,想到哪里写到哪里,不用纠结于到底给函数取个什么名字,只管关注实现的功能。jquery 写起来也有这特性,有时候我宁愿通过 jquery 修饰页面而不是 css,写这种代码的感觉比写 css 还好。

#50 楼 @zw963

我本来不想回复这个问题的,每个语言都有语法糖,不能横向比较,比如让 Python 搞个 attr_reader 方法,估计一两页都写不完。可以看这里http://c2.com/cgi/wiki?PythonRubyAttrComparison

不过既然你问了,我也来个邪恶的吧: Hash[*(s.length.odd? ? s.concat(' '): s).each_char].keys.join,如果 Hash[] 能自动处理单数的参数,这个就会短很多了

Hash[*s.each_char].keys.join

#52 楼 @gaicitadie 我知道 python 3 是想推动语言发展啊,可是社区不跟进,导致 python3 现在出来 3,4 年了吧,还没普及。django 还是再用 2.6 或者 2.7. 如今 Python 3 不仅没有甩掉历史的包袱,自己的定位也很尴尬。

我用过一点 Python, 个人还是很喜欢 python 3 的改变的。

#52 楼 @gaicitadie #51 楼 @hooopo #55 楼 @hisea

真是太谢谢楼上几位了!!

我就是一个想法,知道能实现,就是验证不了,你们帮了大忙了。

@gaicitadie 的回复就是我要的答案~~ 我就说嘛,肯定可以类似这样处理。昨天脑袋卡壳了。

@hooopo , 这种方式我是知道的。如果真解决问题,我肯定会用这种方式,因为针对字符串,用 scan(正则的方式) 效率应该高的多。因为这就是 Ruby 擅长的地方嘛。

@hisea , 不得不说,你的想法真的太邪恶了!! 不过,我真有过和你类似的想法。事实上和 each_slice 也的确很相似,只不过自己没有实现而已,你太有才了。我觉的这些语法糖对于熟悉 Ruby 的 API 还是有帮助的。

P.S. 听说,Perl 的数组好像索引可以通过某个$类型的变量直接引用。

#52 楼 @gaicitadie

尽快再开一个砸场子 贴子呀。好期待呀。

@zw963 场子不能砸,只是个人观点,没想到会有这么多人参与讨论!ruby 使用下降趋势是从 TIOBE 上看来的,但是对于 ruby 的 rails 我还是非常喜欢的! 以前我是做 php 的,貌似 php 比 ruby 更易维护扩展!

大家以为我是高手了,我是来学习 ruby 的 newbie,鸭梨山大 ing -_-|||

#58 楼 @boardsky 我真不知道 php 容易维护是指的什么......

@hooopo 个人感觉,我做 ruby 有一段时间啦,做的项目在分别会在 mac,linux,和 window 平台上跑,这 ROR 也够整人的,在 mac 上能跑,到 linux 和 window 上就不能跑了,找资料呗,弄了几天才解决了 linux 上运行不正常的问题。windows 上面就更难整了。。php 的项目在平台上转移,问题要少很多.... 这是切身体会的... 还有就是 ROR 的版本兼容性问题,真的让我蛋疼了,高级版本对较老的版本不怎么兼容.... 这样就导致学习 ROR 的时间成本有点高!每出来一个版本,花大量时间阅读文档!

#55 楼 @hisea 不出意外的话,Django 1.5 会支持 Python 3 的。

#61 楼 @boardsky 你说这些都是事实!说的都是对新手的友好性,和以维护/易扩展一点关系都没有。

#57 楼 @zw963 搞个 砸场子 节点吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号