Introspection and ObjectSpace: Examining Data and Methods at Runtime
Ruby提供了很多方法用来在运行时查找对象。还有访问实例变量对象方法。使用他们的时候要当心,因为这些方法
破坏了封装。
class C
def initialize
@ivar = 1
end
end
c = C.new
c.instance_variables # => ["@ivar"]
c.instance_variable_get(:@ivar) # => 1
c.instance_variable_set(:@ivar, 3) # => 3
c.instance_variable_get(:@ivar) # => 3
Object#methods方法返回实例方法的一个数组,包含了定义在接受者上的单例方法。如果这个方法的第一个参数是
false,则只返回对象的单例方法。
class C
def inst_method
end
def self.cls_method
end
end
c = C.new
class << c
def singleton_method
end
end
c.methods - Object.methods # => ["inst_method", "singleton_method"]
c.methods(false) # => ["singleton_method"]
Module#instance_methods返回了类或者模块的实例方法。instance_methods是被class调用而methods是被实例调
用。给instance_methods传递一个false跳过了父类的方法:
C.instance_methods(false) # => ["inst_method"]
也可以用Metaid的metaclass来检查C的类方法:
C.metaclass.instance_methods(false) # => ["new", "allocate", "cls_method",
"superclass"]
In my experience, most of the value from these methods is in satisfying curiosity. With the
exception of a few well-established idioms, there is rarely a need in production code to reflect on
an object's methods. Far more often, these techniques can be used at a console prompt to find
methods available on an object—it's usually quicker than reaching for a reference book:
Array.instance_methods.grep /sort/ # => ["sort!", "sort", "sort_by"]
ObjectSpace
ObjectSpace是一个用来和Ruby的对象系统交互的模块。它有几个很有用的可以使底层hacking更轻松的模块方法:
Garbage-collection methods: define_finalizer (sets up a callback to be called just before an object is destroyed), undefine_finalizer (removes those call-backs), and garbage_collect (starts garbage collection).
_id2ref converts an object's ID to a reference to that Ruby object.
each_object iterates through all objects (or all objects of a certain class) and yields them to a block.
尽管这些方法很有用,但是也很危险。慎重的使用他们。
在Ruby的Test::Unit框架里有个恰当的使用Objectspace的例子。代码用了ObjectSpace.each_object来列举所有存在的继承自Test::Unit::TestCase类。
test_classes = []
ObjectSpace.each_object(Class) {
| klass |
test_classes << klass if (Test::Unit::TestCase > klass)
}
不行的是,ObjectSpace是Ruby的虚拟机更加复杂化。特别是打开ObjectSpace打开的时候Jruby的性能受损很严重,因为Ruby的解析器不能直接的检查在JVM的内部数据的存在的对象。相反的,JRuby必须保持手工的跟踪对象,这将增加很多的消耗。相同的技巧可以在像Module.extended和Class.inherited的方法得到,这些不会有ObjectSpace更切实。
分享到:
- 2008-06-09 22:10
- 浏览 1002
- 评论(2)
- 论坛回复 / 浏览 (1 / 1978)
- 查看更多
相关推荐
"Advanced Rails" 涵盖了Rails开发中的高级主题和技术,是Ruby on Rails学习进阶的重要资源,尤其适合已经对基础Rails有一定了解的开发者。 在Web开发领域,Rails以其高效、简洁的代码和“约定优于配置”的哲学吸引...
本书旨在为初学者提供深入理解Ruby on Rails框架的指南,从基础概念到高级主题均有涵盖,是学习Ruby on Rails的理想选择。 ### 重要知识点概览 #### 1. Introducing Ruby on Rails(介绍Ruby on Rails) 这一章节...
### Ruby编程语言——基础知识与应用 #### 一、Ruby简介 《The Ruby Programming Language》是一本详细介绍Ruby语言的权威书籍,由Ruby之父Yukihiro Matsumoto(松本行弘)与著名技术作家David Flanagan共同撰写。...
- **目标读者**:本书面向的是对Ruby编程语言感兴趣的程序员和技术人员,无论是初学者还是高级用户都能从中受益。 - **主要内容**: - **Ruby基础知识**:包括语法、数据类型、流程控制等基础概念。 - **面向对象...
根据提供的文件信息,我们可以推断出这是一本关于高级Ruby on Rails编程的书籍,作者为Brad Ediger,并由O'Reilly Media出版。由于文件提供的内容有限,以下将基于已有的信息来总结并展开相关的知识点。 ### 一、...
2. **高级编程技巧**:除了介绍Rails的基础知识外,《Advanced Rails Reciples》还深入探讨了Rails框架中的高级编程技巧,如性能优化、安全性增强等。 3. **实战案例分析**:书中通过多个实战案例来展示如何将Rails...
Ruby是一种强大的动态编程语言,广泛用于Web开发,尤其是在Ruby on Rails框架中。为了在服务器环境中更好地利用Ruby,一些专门针对服务器优化的发行版被开发出来,以提高性能、减少资源消耗并简化管理。"Ruby-服务器...
通过阅读《Pragmatic Bookshelf Advanced Rails Recipes May 2008》,开发者可以掌握Rails的高级特性,提升他们的编程技巧,同时也能更好地理解Rails如何与其他Web开发框架相比较,从而在实际项目中做出更明智的技术...
这些资源涵盖了从基础到高级的Ruby编程知识,以及相关的Web开发框架Rails的内容。此外,还有诸如《Ajax on Rails》和《Ruby on Rails: Up and Running》等其他主题的书籍,显示了Ruby语言及其生态系统在Web开发领域...
O'Reilly Media是一家领先的科技图书出版商,除了《Ruby编程语言》外,还提供了多部与Ruby相关的著作,如《Ruby Cookbook》、《Learning Ruby》、《Advanced Rails》、《Rails Cookbook》、《Ruby Pocket Reference...
Rails是一个流行的开源Web应用框架,基于Ruby编程语言,它遵循模型-视图-控制器(MVC)架构模式,为开发者提供了构建高效、简洁的Web应用程序的能力。 在描述中提到的“博文链接:...
从描述中可以提炼出,这本书是入门Ruby的理想选择,书中内容覆盖了Ruby编程语言的基础知识,为读者打下坚实的基础。书中所涉及的内容可能包括但不限于Ruby语言的语法、数据类型、控制结构、模块、类和对象、异常处理...
在Ruby编程环境中,微信小程序的对称加密数据解密算法主要涉及到的是AES(Advanced Encryption Standard)加密技术。AES是一种广泛使用的块密码,以其安全性、效率和标准化而闻名。本项目"wechat_aes_sample_ruby-...
代码测验关于网站包含许多关于Ruby,Rails,JavaScript,Bash,Git等的编程实践问题! 当我学习编程时,我为自己创建了测验,并决定创建CodeQuizzes作为我的第一个Rails应用程序,以与世界分享这些测验。 现在,该...
1. **Ruby on Rails 框架与 RabbitMQ 的结合**:Ruby 社区最著名的框架是 Ruby on Rails,这些教程可能会讲解如何在 Rails 应用程序中设置 RabbitMQ,以实现后台任务处理、事件驱动架构或微服务通信。 2. **AMQP ...
Ruby作为一种动态、灵活且富有表现力的编程语言,近年来在软件开发领域得到了广泛应用,尤其在集成不同系统和服务方面展现出强大的潜力。这本书的核心目标是帮助开发者理解和实践Ruby在企业级集成中的最佳实践。 在...
在Ruby编程语言中,我们主要会使用到以下几个核心概念: 1. **Ruby基础**:Ruby是一种动态、面向对象的脚本语言,以其简洁和表达性强而著称。在构建"Odin Flight Booker"时,你需要掌握变量、数据类型、控制结构...