首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  Ruby

Ruby 中 Singleton 方法的另一种理解方式

  •  
  •   rockllei · 2016-10-19 10:34:21 +08:00 · 3147 次点击
    这是一个创建于 1148 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Ruby 中的 Singleton 方法是 Ruby 中一个重要的知识点,也是做 Ruby 元编程的一个重要技巧。 简单的说就是在 Ruby 中任何自定义类都是 Class 这个类的一个实例,所以 Singleton 方法其实就是一个实例所拥有的方法,比如:

    a = "hi"
    
    def a.you
      "hi,  you"
    end
    
    a.you # => hi, you
    
    "hello".you # => undefined method 'you'
    

    上面的 a.you 方法就是 a 这个字符串实例的 Singleton Method 。

    同样如果拿我们最熟悉的类举例子的话就是:

    class A
      def self.hi
        'hi A'
      end
    end
    
    A.hi # => hi A
    

    上面的定义方法所有的同学应该都知道,其实就是类方法的定义,在 Ruby 中类方法其实就是类的 Singleton Method ,就像上面说的因为 A 也是 Class 这个类的一个实例(通过 A.class 就可以知道),所以,其实上面的方法也可以这样定义:

    class A
    end
    
    def A.hi
      'hi A'
    end
    
    A.hi # => hi A
    

    这样的话,就和上面字符串 a 的效果一样,就更容理解了。 所以关键是理解我们所定义的类也是 Class 这个类的一个实例,这是关键。


    其实我想说的,下面才是关键,

    蛋人网 http://eggman.tv 的最新系列大课程<Ruby 元编程="">已经开坑了,从今天开始会陆续更新,第一节视频课件<Ruby 元编程的介绍和使用场景="">已经放出,免费的, http://eggman.tv/c/s-ruby-meta-programming ,计划每周更新两期,上面讲述的是课件一部分内容,我们计划会在整个课件中为大家讲述:

    • Ruby 基础类结构
    • Module Mixin 设计模式
    • instance_eval 和 class_eval 的使用,以及*_eval 类和*_exec 类的区别
    • Singleton 方法的原理和各种使用场景
    • ActiveSuppot::Concern 的实现原理
    • define_method & method_missing
    • Block 的进阶使用

    等等众多深入内容的讲解,当然还包括众多的实例演示和如何使用这些高级技巧,欢迎各位大哥大嫂前来支持。

    4 回复  |  直到 2016-11-08 11:02:28 +08:00
        1
    rockllei   2016-10-24 16:23:43 +08:00
    看来技术贴不受欢迎这里
        2
    franklinyu   2016-11-06 13:49:36 +08:00
    @rockllei 只是 Ruby 節點人少吧
        3
    franklinyu   2016-11-06 13:51:00 +08:00
    @rockllei 而且你這明明是廣告……
        4
    rockllei   2016-11-08 11:02:28 +08:00
    @franklinyu 我们比较软不硬
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1268 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 18:06 · PVG 02:06 · LAX 10:06 · JFK 13:06
    ♥ Do have faith in what you're doing.