• Onigmo at 2013年03月17日

    稍后看看~~

    Ruby Conf 2012 , 吕哥的传道,这一块儿就没有听明白的说....

  • 程序员发财有几条路啊? at 2013年03月17日
  • @lgn21st

    强烈建议以后这种帖子放入 抬杠纯盖楼 版块。并注明纯属娱乐言论,不负任何责任。

    讨论来讨论去,永远不会有个结果 ...

    对于新人,这种帖子只有被误导的份儿,没任何好处。

  • 好吧,这么热的帖子,好歹也该留个名。

    #123 楼 @huacnlee

    此外,说 Linux 好用的,那是因为你们都是老鸟。新手(接触 Linux 的新手)一来就>> 装一个 Linux 得郁闷死他。

    而你给新手一个 Mac 感觉就不同了。

    这也同时意味着,成长为老鸟的周期被无限期的拉长了...

    本人就是这方面的实验品,用 Windows 八年,不如用 Linux 半年搞懂的东西多。

    这里用 Windows 和 Mac 类比虽然有些不妥,但是仍具有一定意义。

  • Ruby 2.0 in Detail at 2013年03月16日

    哇~ 终于可以对 2.0 有一个较全面了解了。

    非常感谢~

    说起 ko1, 原来他就是写 YARI 那个?? 他的 github 页面刚刚发布了一个基于 ruby2.0 debug API 的 debugger2

    https://github.com/ko1/debugger2

  • #2 楼 @luikore

    双打散,听着很搞怪呀~~ 我把作为形参的 splat 叫做 数组化 , 所以这个 double splat , 叫做 哈希化 也不错。

  • 不错~

  • Ruby 2.0.0 by Example at 2013年03月11日

    难得整理,翻译过来就更好啦。

  • Cap 我还没开始用呢....

  • #25 楼 @doitian

    MiniTest 当中,是一个对象的 eigenclass 作为类的实例。完全与 subject 无关。必须自己手动将 subject 代入才行.. RSpec 我不知道呀。也没装~

    你和 @lgn21st 两个人说了两个样,RSpec 也太绕了。

  • #21 楼 @doitian

    describe Post do
      # 这里没有定义 subject,所以默认就是 Post, 而且不需要去初始化对象,因为测试的是 Post 本身而不是它的实例。
      # 出处: https://github.com/thoughtbot/shoulda
      it { should belong_to(:user) }
      it { should validate_presence_of(:title) }
    end
    

    那么这个呢?到底是 Post.new 还是 Post ?

  • #14 楼 @nightire

    基本上看明白了你讲的语义,不过我觉得 #13 楼 @lgn21st 讲的更简单明了一些?

    不过我也看出来一点:不是你们把简单问题复杂化,要怪只能怪 RSpec 做的太臃肿了。 这个观点不是我的,而是 MiniTest 的作者的。我只是转述一下。(貌似他是 Rspec 前作者之一)

    下面是这两个方法在 MiniTest 的源码,通过这个源码就不难理解,为什么我的想法和你不太一样了。

    ##
    # Essentially, define an accessor for +name+ with +block+.
    #
    # Why use let instead of def? I honestly don't know.
    
    def self.let name, &block
      define_method name do
        @_memoized ||= {}
        @_memoized.fetch(name) { |k| @_memoized[k] = instance_eval(&block) }
      end
    end
    
    ##
    # Another lazy man's accessor generator. Made even more lazy by
    # setting the name for you to +subject+.
    
    def self.subject &block
      let :subject, &block
    end
    

    MiniTest 的约定很简单:

    1. 一个上下文中只应该有一个主题,所以,subject 干脆不提供参数。也不要这个 account, 那个 product 了,干脆大家都用 subject. 因为他就是 主题.
    2. 除了主题之外,其他东西用 let 提供。当然你非要全部重命名 (不用 subject, 使用更加贴切的名字), 那就全部用 let 好了。

    #13 楼 @lgn21st 明白了默认 subject 的含义... (不过,那个例子中应该是 belongs_to ? )

    另外,从源码中来看,有关 lazy-evaluated, let 和 subject 没有什么区别的。他们都是 lazy 的. 或者说:他们都是通过 block 方式实现了 lazy_evaluated. 代码中体现出来的只是,对象是通过一个上下文中的全局 Hash 被 Cached, 当复用时,无需反复创建对象。

    我觉得 RSpec 大家都用的原因是:UnitTest 太慢了... 不过,现在的 MiniTest 已经比 RSpec 快很多了,现在已经 Ruby 2.0 & Rails 4 时代了,给个建议,大家是否可以考虑了解下 MiniTest ??

  • Monkey Patch 的作用域 at 2013年03月10日

    因为根本是两个概念呀。

    Ruby 中至少到现在为止,不存在所谓的 包管理 ?? 你要是直接 hack 了一个核心类,则每一个应用都会受到影响,这就是常说的 Ruby 不适合大规模开发 所诟病的东西,refinement 就是在试图改善这个印象,将可影响的范围降到一个局部。不过 Ruby 2.0 p0 里面,这个特性还只是一个玩具...

    
    module FooBar
      refine String do
        def hello
          puts "Hello, world"
        end
      end
    end
    
    "str".hello     # => No Method Error
    using FooBar    
    "str".hello     # => "Hello world"
    
    
  • #3 楼 @nightire

    探索精神赞一个~~

    不过,是不是有点把简单问题复杂化了?是不是站在测试的角度来分析这两个东西,更清晰? 我觉得似乎我的答案还是好懂点?? 呵呵。

    有几个问题:

    # 使用 subject
    describe CheckingAccount, "with $50" do
    # 直接用的 Class Name,若此时没有显式定义 subject,那么默认的 subject 就是 CheckingAccount,可通过在代码中输出 subject 获知
      subject { CheckingAccount.new(Money.new(50, :USD)) }
      it { should have_a_balance_of(Money.new(50, :USD)) }
    end
    

    你注释是什么意思?如果没有定义 subject { ... }, 默认就是 CheckingAccount, 这默认怎么知道如何去初始化对象,难道会解析你那个 "with $50" ??

    # 重构上面的例子
    describe "Checking Account initialization" do
      let(:starting_balance) { Money.new(50, :USD) }
      subject(:account) { CheckingAccount.new(Money.new(50, :USD)) }
    
      it "has $50 balance" do
        expect(account).to have_a_balance_of(starting_balance)
      end
    
      it "has a balance attribute which equals the starting balance" do
        expect(account.balance).to eq(starting_balance)
      end
    end
    

    我就最后这个看得最清晰了,不过,我没看出来 这个里面 let 和 subject 有啥区别? 这种情况为什么不用两个 let ?

  • Monkey Patch 的作用域 at 2013年03月09日

    Ruby 2 实现了一个新的语法叫做 using, 的确是你想要的功能,不过貌似有较大的 bug, 在 Ruby 2.0 p0 中,只是作为一个实验性的尝试。

    include A 混入的是 A 里面定义的实例方法。你搞错了 include 的含义。

  • 新人求大神们指教 at 2013年03月09日

    #5 楼 @lostleaf

    我替大神回答; 在大神眼里,除了 erlang, 其他计算机语言,根本算不上 完全面向对象的语言.

    所以他会推荐你学 erlang ...

  • 新人求大神们指教 at 2013年03月09日

    @bhuztez 大神的话,总是很飘逸,让我等的思绪完全追不上...

  • d at 2013年03月09日
  • d at 2013年03月09日

    我觉得那个姐姐有严重的强迫症...

    嗯嗯,就像以前的我一样。

  • 新人求大神们指教 at 2013年03月09日

    只给一句话箴言:(不是我原创的)

    学 Ruby 没有捷径!

  • 好吧,我先说有关提问的两点:

    • 我觉得这样的一个问题,用不着呼叫那么多大牛们来解释的... 杀鸡焉用牛刀?
    • 这样的问题完全可以自己 Google 找到答案。

    最后我还是回答好了,我不是大牛,我适合回答这样的问题。

    let 以及 subject 是类似于 Minitest 中的 before 的简写形式

    subject { ... } 定义了一个叫做 subject 的方法,它返回了代码块内定义的那个对象. let(:a) { ... } 定义了一个叫做 a 的方法,他也是返回了代码块内定义的那个对象。

  • #4 楼 @luikore 已经回答了...

    不仅仅是 Ruby 是这样,C# 语言作为一门静态语言也是这样。这不是 Ruby 特有的问题...

  • TDD 效率还真不错 at 2013年03月09日

    我把楼主的意思详细描述一下:

    首先要写测试 ... 当然你必须知道如何写 正确的测试. <单元测试>

    如果测试可以正确的写出来,你往往需要做很多事,例如重构,重构再重构。

    你测试终于写出来了,也通过了,爽!这证明我的代码现在执行是正确的。

    而且这些测试可以作为 回归测试, 即:它可以保证将来修改代码之后的代码也总是正确的,我不会在同一个地方,再次摔跤...

    最后,你突然发现,经过这个过程之后...

    你的代码变的 优雅, 易懂 了...

  • 买个 Surface Pro 玩 Linux ... at 2013年03月09日

    #15 楼 @jasl

    如果纯 CLI 下玩如何?最多装个 XFCE. 很基本的 图形界面。 发愁的是:触摸驱动,不知道 Linux 下才能开始支持。要求也不高,能上网,翻电子书就可以了. 主要看中这本子的便携,做工质量。

  • 买个 Surface Pro 玩 Linux ... at 2013年03月09日

    #13 楼 @tiseheaini

    你说的是 ARM 架构的 Surface RT, 那是个纯平板. 我说的是 Inter 架构的 Surface Pro, 这是个平板化的手提电脑。

    后者可以关闭 Secure Boot 的。前者不行。

  • 买个 Surface Pro 玩 Linux ... at 2013年03月08日

    #11 楼 @tiseheaini

    .... Win8 太大了,如果我用这个机器,我从没想过还保留 Win8.

  • 济南有什么 Ruby 的聚会么 at 2013年03月08日

    #23 楼 @hisea

    我靠~~ 多久没冒泡了.... 居然还有人认识你。哈

  • 买个 Surface Pro 玩 Linux ... at 2013年03月08日

    #7 楼 @bhuztez

    哈~ 将来有条件了,不是不可能呀。现在木条件呀。

    话说了,一个 iPhone 都四五千... 在上海成了街机很久了,这个 64G SSD 的六千多不算贵吧。功能应该比 iphone 强太多了。毕竟,这是一台完整功能的电脑。