• 解决 stack level too deep 问题 at 2016年01月06日

    #22 楼 @leiz_me 我的理解是传入 mouse,这是个变量,假如这个变量被定义过是一个方法,那么解释器会认定该变量是一个方法名称,出现文中的 SystemStackError 错误,但是如果该变量没有定义过,则会报出 undefined 错误。如果传入的是:mouse,解释器会认为这个一个已经被定义过的 Symbol 对象,可以作为参数被使用。

  • 解决 stack level too deep 问题 at 2016年01月06日

    #20 楼 @leiz_me :mouse 应该叫是叫符号对象

  • 谢谢楼上各位的指点,感激。

  • #2 楼 @qinfanpeng 能不能请帮忙看下我的理解问题在哪里?感谢。

  • #1 楼 @nowherekai 非常感谢指出问题,这两句话我理解,在这里 gets 和 ARGV 指向相同的字符串内容,我的疑惑是 while 的作用,while 这里是做判断,返回值应该是 true 或者 false,所以 print 打印的应该也是 while gets 的返回值才对。

  • 关于 Ruby 异常捕捉问题 at 2015年12月27日

    #3 楼 @quakewang bingo 返回和输出返回值是两码事情。

  • 关于 Ruby 异常捕捉问题 at 2015年12月27日

    #1 楼 @quakewang windows 下的终端,ruby 版本 2.1

  • #10 楼 @torubylist 代码自己执行一遍就好了

  • 解决 stack level too deep 问题 at 2015年12月26日

    #18 楼 @kikyous 前段时间买了,还没有开始看,感谢。

  • 解决 stack level too deep 问题 at 2015年12月26日

    #16 楼 @kikyous

    解释器对每个表达式都是从右向左求值的的
    

    谢谢指点,我不是专业出生,编译原理和解释器的知识基本上没有,按照这个说法,那么能解释的通了,感谢。

  • 解决 stack level too deep 问题 at 2015年12月26日

    #10 楼 @kikyous 如果将代码中的 component mouse 改为 component cc,则显示的是 undefined local variable or method, 可见,这边的“cc”,没有作为参数在被使用,但是改为 component :cc ,则代码执行成功,这说明:cc 在作为参数被使用,这是为何?

  • 解决 stack level too deep 问题 at 2015年12月26日

    #9 楼 @adamshen 递归的原理这个我明白,只是不明白为什么 mouse 是作为方法在使用,而不是作为 componet 方法的参数变量在使用。

    def mouse
       component mouse
       #componet(mouse) 与上面代码功能相同
    end
    
  • 解决 stack level too deep 问题 at 2015年12月26日

    #7 楼 @adamshen 谢谢指点,链接的内容已经看完,并且收藏。我的理解是:

    def mouse
       component :mouse
    end
    

    若对象调用了 mouse 方法,就是在这个方法中执行 component 方法,这个方法的参数是 mouse。但是为什么将:mouse 的符号标识符去掉,变为 mouse 之后,如下代码:

    def mouse
       component mouse
       #componet(mouse) 与上面代码功能相同
    end
    

    就变成了死循环,为什么这个 mouse 不能作为 component 方法的一个参数使用呢?

  • #8 楼 @lolychee 第一版有问题,不过第二版改过来了。

  • 问题解决:因为“.”是可以匹配任何“一个”字符,因此这里(.)不能匹配 mouse,因为 mouse 有五个字符,所有正确的做法是应该使用(.*)或者(.+)的方法匹配任意多的字符,其中前者表示重复 0 次及以上,后者表示重复 1 次及以上。

  • #3 楼 @rei 谢谢指正。

  • #4 楼 @adamshen ok,是这个问题~

  • #1 楼 @adamshen

    data_source.methods.grep(/^get_(. )_info$/){ Computer.define_component $1 }
    

    这句代码可以实现定义 mouse

  • 两段元编程代码的疑问 at 2015年12月26日

    #25 楼 @liukai 明白了,谢谢

  • 两段元编程代码的疑问 at 2015年12月26日

    第二个问题终于搞明白了,之前出现困惑的原因是因为我认为下面的代码:

    @time_class = FakeTime
    

    是通过 FakeTime 的返回值对@time_class进行赋值,因为 FakeTime 没有返回值,因此这样的赋值没有意义。但实际上真正的理解是类 FakeTime 直接赋值给实例变量@time_class,然后通过后面的@time_class.time_class.now,也就是 FakeTime.time_class.now 获取固定的时间值。

  • 解决 stack level too deep 问题 at 2015年12月26日

    #3 楼 @rei 我将

    def mouse
      component(mouse)
    end
    

    其中的 mouse 改为任意一个变量 cc,即代码如下:

    def mouse
      component(cc)
    end
    

    出现了问题为:undefied local variable and method "cc",但是代码改为 component(:cc),则出现正常,那么我想问,在 componet(XX),中,如何判断 XX 是参数名还是方法名?

  • 解决 stack level too deep 问题 at 2015年12月26日

    #1 楼 @rei 那相当于 componet :mouse 是发送参数 mouse 给 componet 方法,而 componet(mouse) 是将方法传递给 componet,因此造成死循环?

  • 两段元编程代码的疑问 at 2015年12月24日

    #15 楼 @torubylist 第二版页码多少?

  • 两段元编程代码的疑问 at 2015年12月24日

    #13 楼 @torubylist 是第一版的 4.2 节么?

  • 两段元编程代码的疑问 at 2015年12月24日

    #2 楼 @luolinae86 在原编程书中 115 页找到一段代码,原理是不是也是同样的?代码如下:

    class Book
      def lend_to(user)
        puts "lending to #{user}"
      end
    
      def self.deprecated(old_method, new_method)
        define_method(old_method) do |xargs, &block|
          warn "Waring: #{old_method} () is deprecated, Use #{new_method}"
          send(new_method, xargs, &block)
        end
      end
    
      deprecated(:LEND_TO_USER, :lend_to)
    end
    
    b = Book.new
    b.LEND_TO_USER("bill")
    
  • 两段元编程代码的疑问 at 2015年12月24日

    #9 楼 @torubylist 原问题已经补全代码,添加了 Load 类,我明白是在修改当前类,我是想问直接调用 FakeTime 这个类给当类实例变量赋值,但是直接调用的 FakeTime 是否有返回值?

  • 两段元编程代码的疑问 at 2015年12月24日

    #1 楼 @qinfanpeng 问题二涉及到类实例变量? 我觉得这里没有涉及到类实例变量吧,见如下代码:

    class Demo
      def self.class_method
        puts "this is the class method"
      end
    end
    
    Demo
    

    在终端执行下面代码,是没有返回值的,那为何@time_class = FakeTime 可以赋值成功?

  • 两段元编程代码的疑问 at 2015年12月24日

    #1 楼 @qinfanpeng 能不能帮我看看上面的理解是否合适?感谢。

  • 两段元编程代码的疑问 at 2015年12月24日

    #3 楼 @adamshen “定义一个类就是执行一段代码”这句话如何理解? 如下代码:

    class Demo
      def instance_method
        puts "this is the instance method"
      end
    
      def self.class_method
        puts "this is the class method"
      end
    
      class_method
    end
    
    obj = Demo.new
    obj.instance_method
    
    

    在类中定义了实例方法和类方法,类中对类方法调用之后,执行成功。在类外部生成实例化对象,实例化对象调用实例方法,执行成功。 所以定义一个类就是执行一段代码是否可以理解为:在类的作用域内,执行代码,比如执行 class_method 这个类作用域中的方法,而对于类作用域外的代码,则不执行,对于标示了 def 的代码块,这个代码块其实不在类的作用域内,因为作用域分割符号为 class,module,def。这样的理解是否合适?