• 争这个有意思么... Android, iMac, Linux, 骨子里不都是一家吗?你随便用那 个,难道换另一个就不会了?

    喜欢那个用那个,无所谓的。但是 Windows 例外,人家算是自成一家的。

  • @ruby_sky, 你已经加入这个公司了吗?

  • 想问下,贵公司是否招聘实习 rails 工程师? 最近在看 rails 3.1 的书,不知道贵公司用的那个版本的 rails?

  • 我可以发,不过,别人不会把我当广告托吧? 说实话,我打印这家店,以前打印不咋样,去年后半年一下改进了. 现在的书,纸质比我买的正版书好多了,而且皮儿防水,超漂亮。

  • 别的不说,把 matz 的 Ruby 编程语言写成入门篇,不敢苟同. 我只能怀疑作者是否看过这本书,是否真正读懂了这本书。

    Programming ruby 1.9 作为入门书,还凑合。不过第四部分, 也不是那么太初级。

  • @ashchan , 实在是晕。哈哈 考虑了这个忘记了那个。已经更改。

  • @hhui, 基于 Ruby 有很多变种可以选择,未来的发展方向真的很难说。

    不过据我了解,在欧美方面,除了官方 Ruby, 下一个普遍看好的版本是 Rubinius, 这就是那个传说中的用 Ruby 写的 Ruby, 他是基于 LLVM 的。

    还有一个项目也很火,叫做 Maglev, 这个项目好像跟 smalltalk 有很大关系. 而且有类似于 LAMP 的全套解决方案,更猛的是,这个项目根本不考虑支持 32 位。

    MacRuby, Jruby 就不说了。其实就是@fsword所说,Ruby 社区的氛围很有包容力, 也很和谐,以上项目都是在不断的彼此之间学习,兼容。

    而且一旦 ISO 国际标准化,所有这些分界线更模糊了。

  • @hhuai, 我觉得你很牛诶,很难想象,原来你不看英文书籍。 我现在直接是中文书根本看不进去。说来你别笑,之前买的'Web 开发敏捷之道第三版', 翻译的算是不错了,但是总是感觉很浮躁 (因为之前好几本有关 Ruby 的英文书), 根本没有看书的感觉,几天了,才翻了几十页。一怒之下,换看英文版的 (head first rails) 立马感觉大变,虽然这本书更初级点,不过的确跟中英文有很大关系。汗。

    哥们儿不妨听我的试试,我英语也很臭,半天迸不出一个词儿来,不过看书没任何问题. 就是初期可能痛苦点,一两本以后,就欲罢不能了。

    当然,前提是这个领域的概念你足够熟悉,建议最初级的看中文。进阶的,尤其是大师的 作品,一律原版。

  • @neutralevil, 我猜想,你说的应该是个类似于 ipad 的玩意儿,但是用来读书, 不过,应该没有翻书 (尤其是来回不停的翻) 那种感觉。

  • @hhui,客气啦,等最近 rails 搞定,然后抽空琢磨下 github, 把我的配置发上去。你瞧瞧。

  • 谢谢@azhao, @hhui, 问题已查清,自己太粗心了,需要深刻检讨!!!

    不过首先说明下:我也不知怎么搞的,8 楼的代码粘帖的时候搞错了,应该 把 nil?改为 empty?.

    问题出在下面这个句子上。

    random_element = rand(max_element+1)
    

    当 random_element 等于 0 时,copy.pop(0) 总是弹出空的数组 [], 下面的语句

    result << copy.pop(random_element) until copy.empty?
    

    成了无限循环,因为没有任何元素真正从数组内弹出,copy.empty?总是为假。

    下面是修改后的版本。效率应该近似于一楼。

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    def rand_split(array, max_element)
      copy = array.shuffle
      result = []
      unless copy.empty?
        random_element = rand(max_element + 1) + 1
        result << copy.pop(random_element)
      end
      result
    end
    
    10000.times {p rand_split(a, 2)}
    
  • 我发这个帖子的根本目的,是希望以前不喜欢用 unless 和 until 的朋友,按照我 的思路理解一下 unless 或 until, 也许会发现一种不一样的感觉。

    最后期望的结果就是:不要那么排斥 unless 和 until, 改用的时候就用。

    另外说起来,Ruby 还有一个特点就是:一个方法有很多别名,很多人也很诟病, 我倒觉得别名不全是坏事,这就是 Ruby 的风格。不同的语境,使用不同的别名。

  • @hhuai, Random.rand 到底哪来的?怎么我在 1.86, 1.87, 1.92 下面测试,都不 可用呢?也没那个库可以 require 啊。

  • @huacnlee, 我也的确是这样做的,嘿嘿,我喜欢他的确是因为他给我带来了快乐。
    不过,ISO 标准化,就像 Java, 我觉得对于 Ruby 自身真是一件影响力巨大的大好事。

  • 看到这个帖子,我要是不留名,我会被雷劈的。

    感谢站长。真是为民服务的大好事。

  • 刚才 step 调试了下,问题就出在下面的语句:

    result << copy.pop(random_element) until copy.empty?
    

    随机性的出现卡死。到底为什么

  • 我之前的代码是这样写的。

    def rand_split(array, max_element)
      copy = array.shuffle
      result = []
      random_element = rand(max_element + 1)
      result << copy.pop(random_element) until copy.nil?
      result
    end
    

    我承认这个代码逻辑有问题 (没有吧生成随机数的代码包含在循环中) 可是我很郁闷的是,为什么以上代码间歇性卡死?难道是使用 pop 的缘故吗? 隐约记得,数组从左边越界,好像会发生异常?

    劳烦楼上几位帮忙分析下。

  • 我把一楼的代码重写了下,看起来更优雅,更 Rubyful

    我简直爱死 until 和 unless 这种 Ruby 风格了,我觉得只有 真的理解了这两个语句的内涵,才算懂 Ruby.

    def rand_split(array, max_element)
      copy = array.shuffle
      result = []
      until copy.empty?
        random_element = rand(max_element+1)
        result << copy.pop(random_element)
      end
      result
    end
    
  • @skandhas, 突然一下明白啦。其实区别就是有没有 yield 这个过程,对吧。哈哈. 之前的想法掉到盒子里了....

    现在想明白了. 其实就是:(比喻下)

    "this is a string".upcase       # => 这是前者. 在字符串对象上直接调用
    "this is a string".each_line {|line| line.upcase} # => 这是后者
    
  • @doitian, 哈。咱俩同道中人啊。 都用 Emacs, 而且都用 zenburn.

  • @skandhas, 你讲的太清楚了,赞一个。

    reduce(&:符号) 的形式,等价于常规的代码块形式。这我知道, 不过你还是没说清楚 reduce(:符号) 这种情况内部是如何实现的。 我看不懂 C 源码,不过之前我猜测,可能仍旧跟代码块类似形式有关, 只不过针对 reduce 功能做了某种优化而已。看样子我的想法是不对的。

  • @hhuai, 大概看了下你的配置,好古老,呵呵。看样子你的确很久不用 Emacs 了。而且插件实在太少了。话说 Emacs 这玩意儿,插件少了,那是相当不爽的。不说别的,就说在这里发帖,如果没有 Chrome 浏览器的支持的插件 edit-server 插件,让我在网页上打字发帖,不如杀了我. 我是设定在访问 ruby-china.org 这个网站时,双击文本表单,弹出一个新的 Emacs frame, 并且打开 markdown-mode. 发完贴,C-cC-c 提交。

  • @hhuai, 你说的我很有同感,尤其是下面这句话:

    用这种定制太强的编辑器有个问题是,会在写代码时打乱我的思路,容易把心思转到这上面去。

    的确是这样的。尤其是接触一个新的环境时,例如最近开始看 rails3.1(以前不懂 rails, 也没做过 web 开发), 照着书上的示例写代码,刚开始根本写不下去,因为我认为自己一行一行输入<#...#>类似代码实在是很丑陋,很无趣,然后就是写上几行,就改一段 Yasnippet.(从 textmate 移植过来的自动补全), 总之改完 html 改 ruby, 改完 ruby 改 css, 改了半天,代码没看太明白,输入速度的确快了。通常这种情况下,我都是改到自己基本满意为止,然后读过的东西也忘的差不多了 (之前老是被打断,没有条理), 只能从头再读了。

    我了解自己的这种行为,跟我的个性有关,在某些方面,我是非常完美主义的。做事情,或者写代码,尤其讲究当时的状态以及 feeling, 事实上之前很多年,我都是很严重的强迫症患者。直到近几年,我才依靠自己的力量彻底克服。不过完美主义,理想主义,是改不了了。

    话两头说:如果时间允许,这种牺牲是值得的。还拿自动补全说事,按照自己的特色改好后,下次再写代码,多练几次后,再写代码,就完全沉醉在代码之中,而丝毫不会受到诸如:"for 循环应该以 ->结尾而不是>结尾", "helper 方法绝对不应该使用 h() 方法", "而获取属性的值,基于安全考虑,一定要使用<#=h .... #>"以及输入 (相对于手指而言) 丑陋的<# ....#>符号。这些事情你不通过定制,是无法达到期望的。

    对于我来说,在接触 Emacs 以前,只要一遇到反复困扰我的同一个问题,我就钻就牛角出不来,然后极度郁闷,最后放弃。自从使用 Emacs 后,钻牛角改了好多,不过,反复被一个问题困扰,即使暂时可以妥协,但绝对是不可以接受的,就如同你想切换 h 和 cpp 一样。

    我也罗嗦说这么多,其实是想表达,Emacs 定制性太强,是优点也是缺点,不过,像你那样,换个系统,就换个编辑器,我觉得学习使用那些编辑器的时间花在 emacs 上 (当时坚持一下), 也许效果会更棒。

    最后,那个白底黑字,实在不敢苟同,不管是保护眼睛也好,还是阅读方便也好,实在不是什么好的色调。尤其是编程,要使用俺色调,我用的是 zenburn, 自己做了少许修改,据说这个方案是从 Vim 上面偷来的。

  • 口水中。我很敬佩 Matz. 不为别的,耐得住寂寞,持之以恒. 可惜我已经第一时间购入这本书了。

  • rails 还不熟,不下论断,不过 Ruby 嘛,其他都好,就是有一点:正则表达式匹配符号,我总是在心里读作"约等于", 然后就打成了"~=".

  • @messiahxu, 我说 inject 和 reduce 效率差不多,测试环境式 1.92 不是 1.93, 通过循环分别测试了 10 次,上下幅度范围很小. 通过&:proc 方式,1.92 下效率真的很差,也许 1.93 有所改善。不过我没测试过。

  • == Hisea 面试 Ruby 程序员时经常会问到关于 Metaprogramming 的问题 ==

    晕死,为什么我在广州面试了好多个,怎么没有一个问我 Ruby 最基本的的问题? 要么就是招我去做运维 (可是我又不会所谓的 Mysql 数据库调优) 要么,Ruby 只字不提,先来一句:使用 Rails 做过什么项目?仿佛 Rails 跟 Ruby 根本没有任何关系一样,从头到尾,不提 Ruby 一个字。真郁闷!

    == 得到的回答往往是 text mate,vim,sublime text 2 等等文本编辑器。==

    不要忘记 Emacs 嘛。而且 Ruby 调试器 ruby-debug 也算很成熟啦,Emacs 甚至专门 有一个插件叫做 dbgr, 支持 linux 下几乎所有的调试器,针对不同的模式,自 动调用对应的调试器,提供大教堂式的调试界面. 下面是 dbgr 的 github. https://github.com/rocky/emacs-dbgr

  • @messiahxu,你一定搞错了,reduce 和 inject 没有效率方面的区别。正如你说,他们是一样的。我只所以分开写,只是希望自己养成不同的风格 (inject 代码块,reduce 使用符号)

    但是以下两段代码区别很大:

    reduce(:+)              # => 效率高
    reduce(&:+)             # => 效率极低
    

    至于原因,我大概可以猜到,Ruby 一定使用甚么方式特别优化了 inject 算法,比单纯的传递符号方式要好。

  • @messiahxu, 我没有说不建议用 reduce 啊。在哈希那一列的那个#, 是指哈希也可以用 reduce 方法,但是意义不大。

  • 更新成为一个大图片啦!! 欢迎大家多提建议。也给我这个新手改正的机会。