Other articles


  1. Meta programming(Class)

    在Ruby中,使用class定义类时,实际上是在运行代码,这与java之类的静态语 言有很大的差别。
    另外,类只是一个增强的模块,因此,任何适用于类的东西也 适用于模块。
    Object Definitions
    * 注1:在类(或模块)定义时,类本身充当了当前对象self的角色。

    result = class MyClass
      self
    end
    
    result     # =>  MyClass
    
    • 注2:Ruby中总是存在一个当前对象self,与此类似,也总是存在一个当前类 (或模块)。每当通过class关键字来打开一个类时,这个类就成为当前类, 但是使用class关键字需要一个类的名字。 如果只有一个类的引用,需要用class_eval()方法打开这个类。

    • 注3:类实例变量仅仅是属于Class类对象的普通实例变量。它仅仅可以被类 本身所访问,而不能被类的实例或之类所访问。

    • 注4:类方法的实质,它们只是一个类的单件方法。

    • 注5: 在类定义中使用一个类方法。

    • 注6: eigenclass是一个对象特有的隐藏类,它是单件方法存在的地方。Ruby中可以使用如下语法进入eigenclass的作用域。

    class << an_object 
      # do ...
    read more
  2. Metaprogramming(Block)

    块继承自“函数式编程语言(functional programming languages)”的世界。
    blocks
    * 注1: 在一个方法中,可以向Ruby询问当前的方法调用是否包含块。这可以通 过Kernel#block_given?()方法来做到。

    • 注2: 如果在一个扁平作用域中定义了多个方法,这这些方法可以用一个作用 域们进行保护,并共享绑定,这种技术称为共享作用域。

    • 注3: 传递给instance_eval()方法的块称为一个上下文探针,因为它就像是一 个深入到对象中的代码片段,对其操作。

    class C
      def initialize
        @x="a private instance variable"
      end
    end
    
    obj=C.new
    obj.instance_eval(@x) #=>"a private instance variable"
    
    • 注4: 有时,你会创建一个对象,仅仅是为了在其中执行块 ...
    read more
  3. Metaprogramming(Methods)

    Ruby是动态语言,没有静态类型检查,同时也提供了很多java等静态语言无法提 供的编程技巧。本章主要专注于消除重复代码的技巧,通过用两种不同的方式对一 段代码的重构来展示Ruby的强大功能,涉及的知识点比较少。
    methods
    * 注1: method_missing()是Kernel中的一个实例方法,当Ruby找不到调用的方 法时,它最后就会调用这个名为method_missing()的方法。

    • 注2: 移除一个对象中的所有方法,以便把它们转换成幽灵方法。

    重构例子

    # 原始代码
    class Computer
      def initialize(computer_id, data_source)
        @id = computer_id
        @data_source = data_source
      end
      def mouse
        info = @data_source.get_mouse_info(@id)
        price = @data_source.get_mouse_price(@id)
        result = "Mouse: #{info} ($#{price})"
        return "* #{result}" if price >= 100 ...
    read more
  4. Metaprogramming(ObjectModel)

    在Ruby程序中,除了对象之外,还有类、模块以及实例变量这些语言构件。这 些语言构件存在于其中的系统称为对象模型。在对象模型中,你可以找到诸 如"这个方法来自哪个类"和"当我包含这个模块是会发生什么"此类问题的答案。
    ObjectModel
    * 注1: class关键字更像是一个作用域操作符而不是类型声明语句,它的确可以 创建一个还不存在的类,不过也可以把这看成是一个副作用。对于class关键 字,其核心任务是把你带到类的上下文中,让你可以在其中定义方法。

    • 注2: 修改已有类的特性时,由于粗心导致bug,像这种鲁莽的修改方式被称为 猴子补丁。不过,如果是正确的运行打开类这种技术,猴子补丁也可以表示为 一个褒义词,会很有用。

    • 注3: 对象是一组实例变量外加一个指向其类的引用。对象的方法并不存在于对象本身,而是存在于对象的类中。在类中,这些方法被称为类的实例方法。 类是一个对象(Class类的一个实例)外加一组实例方法和一个对其超类的引用。 值得注意的是,实例变量存放在对象中,而方法存放在类中,比如

    class MyClass
      def my_method ...
    read more
  5. Metaprogramming(Tutorial)

    元编程(Metaprogramming),简单来说,就是写出编写代码的代码。正式的定义为:编写在运行时操纵语言构件的代码。 Ruby是一门对元编程支持很强大的语言(只是比lisp弱一点),而且,元编程 也是通向Ruby的高级编程之路。可以说,除非掌握了元编程否则不能算是真正掌 握了Ruby。 下图简要总结了的基本内容,经验有限,不足之处请多指正。
    RubyMetaprogramming
    就如蜘蛛侠大叔曾经说的,能力越大,责任越大。元编程赋予了你强大的能力,同时也意味着你需要肩负更大的责任。

    read more
  6. Ruby Variables

    ruby变量类型有其首位字符来决定,分类如下:
    $ 全局变量
    @ 实例变量
    @@ 类变量,在module中定义的模块变量可被所有包含该module的类所访问
    [a-z] 局部变量
    [A-Z] 常量
    self 伪变量,永远指向当前正执行着的对象或未初始化变量的空值nil

    read more

blogroll

social