`
Anleb
  • 浏览: 32783 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ruby元编程之大话 对象模型

阅读更多
class A
    @@var=1
    @class_var="class var"
    attr_accessor :object_var,:object_var2
    class << self
        attr_accessor :class_var
        def a_method1
            
        end
    end

    def  A.a_method2
    end

    def self.a_method3
    end

    def ask
        @object_var="object var"
    end
end

a=A.new

def a.ask1
end



与类相关的无非是对象,类本身,对象实例变量,类本身实例变量,类变量,对象的实例方法,类的实例方法(类方法)

先说各种变量:
a=A.new
p a.instance_variables #对象的实例变量
a.ask
p a.object_var2=2
p a.instance_variables #对象的实例变量

p A.instance_variables #类的实例变量

打印信息:
[ ]
2
[:@object_var, :@object_var2]
[:@class_var]

[ ] 很显眼,ruby和其他语言不同,他的变量属于对象本身,也就是说,@object_var存在于方法ask内,如果这个方法不调用,那么a对象是不会有实例变量的,而且如果调用方法,方法内的实例变量是nil,退出方法的时候,因为是空指针引用,也会被GC回收掉,所以也是[ ]。
这里类的实例变量没有调用为什么也会显示出来,是因为ruby的class A end 这个作用域内的代码是会被执行的,所以A是有实例变量的。

对象的实例变量是存在于对象本身之中的,这里的对象可以是a,可以是A,可以是任何,因为ruby一切都是对象。


方法:
p a.methods.grep(/ask/)
p a.class.instance_methods.grep(/ask/)
p A.methods.grep(/a_method/)
p A.class.instance_methods.grep(/a_method/)

打印:
[:ask1, :ask]
[:ask]
[:a_method1, :a_method2, :a_method3]
[]


说明:对于单件方法是存在于单件类中的,而对于实例方法是存在于所在的类中的,只有这样才可以实现,对于特定的对象的方法,只能特定对象能访问,对于实例方法,所有对象都可以方法。

下面重点说下attr_accessor 存在哪里:
p A.class.instance_methods(false).grep(/^class_var=?$/) #不打印祖先的方法
p A.methods.grep(/^class_var=?$/)


p a.class.instance_methods(false).grep(/^object_var=?$/) #不打印祖先的方法
p a.methods.grep(/^object_var=?$/)

打印:
[]
[:class_var, :class_var=]
[:object_var, :object_var=]
[:object_var, :object_var=]

从上面结果可知,对于类的attr_accessor 是存在于类的单件类中的,对象的attr_accessor是存在于对象所在类的。对于单件类,object对象必须要存在单件方法才会生成单件类,而类的单件类是一开始就存在了。



类变量:
@@var这种带@@的是类变量,这个很特殊,它被所有对象都共享,所以它存在于类中,而且必须要初始化。
14
16
分享到:
评论

相关推荐

    Ruby元编程第二版中文

    在Ruby中,元编程的强大之处在于其语法简洁且易于理解,使得程序员可以轻松地实现动态行为。Ruby提供了多种元编程工具,包括: 1. **方法定义与调用**:Ruby允许在运行时定义和修改方法,如`define_method`函数可以...

    ruby元编程.pdf

    Ruby的对象模型是理解元编程的基础。书中通过组织和解释Ruby对象模型的概念,帮助读者清晰理解Ruby的继承和混入机制。 2. 闭包(Closures):在Ruby中,闭包是匿名函数的概念,它能够捕获定义时的上下文环境。闭包...

    《Ruby元编程》PDF版本下载.txt

    元编程技术广泛应用于多种编程语言中,其中Ruby因其灵活的语言特性和动态特性而成为元编程的理想选择之一。 #### 1.2 Ruby中的元编程特点 - **动态性**:Ruby是一种动态类型语言,这意味着可以在运行时修改类和对象...

    Ruby元编程pdf

    Ruby元编程的核心概念包括类、模块、方法、变量和对象的动态性。以下是对这些概念的详细解释: 1. **类与模块**:在Ruby中,类和模块都是对象。你可以动态地创建和修改它们。例如,你可以通过`Class.new`创建一个新...

    Ruby元编程-中文

    ruby 元编程 中文 《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有...Ruby之父松本行弘作 序推荐。

    Ruby元编程【英文版】

    本书得到了Ruby之父松本行弘的高度评价,并被推荐为学习Ruby元编程的必读书籍之一。 #### 三、书中涵盖的主要元编程技巧 1. **对象模型与类的动态行为**:Ruby的对象模型非常灵活,本书详细解释了如何利用这一特点...

    Ruby元编程中文版

    Ruby元编程中文版

    元编程 Ruby

    Rails的ActiveRecord模型就是通过元编程来实现其魔法般的动态方法生成,例如,我们可以直接对模型使用find_by或where等方法,而这些方法在Ruby代码中是不存在的,它们是在运行时动态生成的。Rails的路由系统、视图...

    Ruby 元编程

    本书的第一部分“Ruby元编程”是本书的核心部分,他讲述了一个资深程序员在办公室一周发生的事情。 本书的第二部分“Rails中的元编程”是一个元编程实例,Rail是Ruby标志性框架。 在阅读本书之前,需要了解本书的三...

    Metaprogramming Ruby 2nd Edition ruby元编程

    理解Ruby的对象模型是进行元编程的基础。通过了解对象是如何创建、如何存储数据以及如何交互的,我们可以更灵活地控制程序的行为。 2. **动态方法定义**:Ruby允许在运行时动态地添加新方法到类或对象上。这种能力...

    Ruby元编程 第2版 中文 佩罗塔著 2015.08

    ruby元编程 第2版 中文 目录清晰 方便广大通勤族路上看,如果喜欢请购买正版纸质图书

    Ruby元编程 源代码 Metaprogramming Ruby source code

    Ruby元编程是编程领域中的一个高级技术,它允许程序员在运行时操纵语言的结构和行为。这本《Metaprogramming Ruby》书籍深入探讨了如何利用Ruby的特性进行元编程,帮助开发者提升代码的灵活性、可扩展性和复用性。源...

    ruby元编程

    《Ruby元编程》以案例形式循序渐进地介绍了Ruby特有的实用编程技巧 元编程 通过分析案例 讲解例题 回顾Ruby代码库的实现细节 《Ruby元编程》作者Paolo Perrotta不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题...

    Ruby动态编程对象编程Ruby动态编程对象编程Ruby动态编程对象编程

    ### Ruby动态编程语言的核心知识点 #### 一、Ruby的特点与优势 **1. 简洁而优雅** - **设计哲学:“最小意外原则”** - Ruby的设计理念旨在减少不必要的复杂性和冗余,使得代码更加直观易懂。 - **简洁的语法** ...

    基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言.zip

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本资料包主要关注的是基于Ruby编程的基础知识和应用,包括如何使用Ruby进行开发和解决问题。 Ruby的设计哲学强调程序员...

    Ruby编程语言入门与实践 .pptx

    Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门与实践 Ruby编程语言入门...

    Ruby元编程基础学习笔记整理

    ### Ruby元编程基础学习笔记整理 #### 一、语言构建(Language Constructs) 在Ruby中,诸如变量、类和方法等元素统称为语言构建(Language Constructs)。这些构建块是构成Ruby程序的基础。 ##### 示例代码分析 ```...

Global site tag (gtag.js) - Google Analytics