`
simohayha
  • 浏览: 1400064 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

rails中的BlankSlate源码分析

    博客分类:
  • ruby
阅读更多
其实这个类实现的功能很简单,那就是实现一个没有predefined 方法的类(除了__send__与__id__).自己也尝试着写了一个,思路什么和BlankSlate很接近,不过代码就丑陋多了。

当写这段代码之前,我们先要分析一下如何才能去掉predefined的方法,这里有三种predefined的方法。

1 Object类本身自带的一些实例方法.

2 打开Kernel模块,或者Object类,然后动态的加入的方法。
module Kernel
  def name1
    "bo"
  end
end
class Object
  def name2
    "bo"
  end
end


3 Object类include的模块里面所含有的方法:

module Name
  def name3
    "bo"
  end
end
class Object
  include Name
end


接下来看代码,我在里面会有注释 :

class BlankSlate
  class << self

#首先,我们定义一个hide方法,这个方法就是隐藏掉BlankSlate类中名字为name的方法,可是instance_eval方法,或者__开头的方法,并不需要被隐藏.
    def hide(name)
      if instance_methods.include?(name.to_s) and
        name !~ /^(__|instance_eval)/
        @hidden_methods ||= {}
        @hidden_methods[name.to_sym] = instance_method(name)
        undef_method name
      end
    end
#这里提供一个可以查找一个方法是否已被隐藏的方法
    def find_hidden_method(name)
      @hidden_methods ||= {}
      @hidden_methods[name] || superclass.find_hidden_method(name)
    end
#这个是为了恢复所被隐藏的方法,首先使用上面的方法查找到方法,(这里使用了define_method,这个方法其实也就是动态的定义一个方法,name就是他的名字,详细的用法可以看我前面的文章)
    def reveal(name)
      bound_method = nil
      unbound_method = find_hidden_method(name)
      fail "Don't know how to reveal method '#{name}'" unless unbound_method
      define_method(name) do |*args|
        bound_method ||= unbound_method.bind(self)
        bound_method.call(*args)
      end
    end
  end
#这里执行hide操作
  instance_methods.each { |m| hide(m) }
end

######################################################################

#这里解决了第二个问题,那就是当一个方法被加入的时候,能够hide这个方法(这里使用了method_added(这个方法我认为是当加入了一个方法之后,然后就会调用这个方法,name就是你所加入的方法的名字).
module Kernel
  class << self
    alias_method :blank_slate_method_added, :method_added
    def method_added(name)
      result = blank_slate_method_added(name)
      return result if self != Kernel
      BlankSlate.hide(name)
      result
    end
  end
end

这里其实我们也可以这么做:


module Kernel
  class << self
    # Detect method additions to Kernel and remove them in the
    # BlankSlate class.
    def method_added(name)
      return super if self != Kernel
      BlankSlate.hide(name)
      super
    end
  end
end


######################################################################
#这个和上面一样的。
class Object
  class << self
    alias_method :blank_slate_method_added, :method_added

    # Detect method additions to Object and remove them in the
    # BlankSlate class.
    def method_added(name)
      result = blank_slate_method_added(name)
      return result if self != Object
      BlankSlate.hide(name)
      result
    end

    def find_hidden_method(name)
      nil
    end
  end
end

######################################################################

#这里是为了解决第三个问题,要注意的是append_features就是include时发生的动作,也就可以说,他其实就是include.所以这里我们必须先保存老的append_features方法,先加入mod方法,然后undef它,最后再返回其他的方法.
class Module
  alias blankslate_original_append_features append_features
  def append_features(mod)
    result = blankslate_original_append_features(mod)
    return result if mod != Object
    instance_methods.each do |name|
      BlankSlate.hide(name)
    end
    result
  end
end


3
0
分享到:
评论

相关推荐

    rails-exporter-源码.rar

    《Rails Exporter 源码解析》 Rails Exporter 是一个用于 Rails 应用程序的开源工具,主要用于数据导出功能。源码分析将帮助我们深入理解其内部工作原理,以便更好地利用它来优化我们的应用。 一、Rails 框架基础 ...

    ruby on rails社区网站开发源码

    在“ruby on rails社区网站开发源码”中,我们可以学习到如何利用Rails构建一个互动性强、功能丰富的社区网站。以下是一些关键知识点: 1. **安装与环境设置**:首先,你需要安装Ruby和Rails。这通常涉及设置Ruby...

    Rails项目源代码

    这个Rails项目提供了学习和研究Web开发的机会,特别是对于Ruby on Rails新手,可以通过阅读和理解源代码来提升技能,了解实际应用中Rails的用法。同时,对于有经验的开发者,这个项目也可以作为一个起点,进行二次...

    rails-playlists-源码.rar

    在本文中,我们将深入探讨Rails框架的基本概念,以及如何通过源码理解其在实现播放列表功能时的核心技术。 1. **Rails基础** Rails的核心理念是DRY(Don't Repeat Yourself),即避免重复代码。它提供了一套强大的...

    ruby on rails 教程源码

    通过分析这个`sample_app-master`,你可以跟随教程逐步了解Rails的每个部分是如何协同工作的。例如,创建新的模型、运行数据库迁移、编写控制器、设计视图、设置路由,以及进行单元测试和功能测试。这将帮助你掌握...

    bhl_rails_solr-源码.rar

    本文将围绕"bhl_rails_solr-源码.rar"这一主题,深入剖析其内部机制,帮助开发者理解如何在Rails应用中有效利用Solr进行数据检索。 首先,我们要了解bhl_rails_solr的基本结构。源码中包含的核心组件可能包括以下...

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    Rails是Ruby语言的一个著名Web应用框架,以敏捷开发和“约定优于配置”...通过对这些版本的源码进行分析和学习,开发者不仅可以提升对Rails框架的理解,还能在实际项目中运用这些知识,编写出更高效、更安全的Web应用。

    Rails.Recipes.Rails.3rd和源码

    这本书通过一系列的“配方”(recipes),为开发者提供了在实际开发中可能会遇到的问题及其解决方案,旨在帮助开发者提高工作效率,解决Rails应用中的各种挑战。 在Rails 3版中,框架进行了大量的更新和改进,包括...

    RailsGuides中那个blog程序源码

    **Ruby on Rails(RoR)** 是一个基于Ruby语言的开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,用于构建高效、简洁和可...通过分析和实践这个项目,开发者能够快速掌握Ruby on Rails的核心理念和开发流程。

    rails-tutorial-源码.rar

    《Rails教程源码解析》 Rails,全称Ruby on Rails,是基于Ruby语言的一个开源Web应用程序框架,遵循MVC(模型-视图-控制器)架构模式。本教程源码主要涵盖了Rails开发的基础到进阶的知识点,对于学习和理解Rails...

    基于ruby on rails开发示例源码

    通过分析这个源码,你可以学习如何使用Rails创建控制器、模型和视图,如何定义路由,如何处理表单提交,如何使用ActiveRecord进行数据库操作,以及如何编写测试确保代码质量。此外,你还可以了解Rails的自动化工具,...

    angular_rails_csrf-源码.rar

    深入研究这个源码,我们可以学到如何在Angular和Rails集成项目中有效地实施CSRF防护,了解如何在前端获取和使用CSRF令牌,以及如何在后端验证这些令牌。这不仅有助于提高应用的安全性,还能让我们对SPA开发过程中的...

    基于C++和多种语言的mod_rails Phusion Passenger设计源码

    本项目是基于C++和多种语言的mod_rails Phusion Passenger设计源码,包含4547个文件,其中包括3321个HPP文件、364个H文件、176个CPP文件、166个RB文件、63个C文件、56个JS文件、54个IPP文件、51个ERB文件和27个...

    在rails中 使用RSpec生产CHM文档

    标题 "在Rails中使用RSpec生产CHM文档" 暗示了这个话题是关于如何在Ruby on Rails(简称Rails)框架中使用RSpec测试工具来创建帮助文档,特别是以CHM(Microsoft Compiled HTML Help)格式。CHM文件是一种常见的...

    rails指南 中文版

    1. **ActiveRecord**:这是Rails框架中的ORM(Object-Relational Mapping)组件,它负责处理数据库操作。通过ActiveRecord,开发者可以使用面向对象的方式来操作数据,而无需编写SQL语句。 2. **ActionController**...

    Agile Web Development with Rails 2nd Edition源码

    源码是学习和理解任何编程技术的基石,通过分析书中的源码,我们可以更深入地掌握Rails的精髓。 1. **Agile Development**: 敏捷开发是一种强调快速响应变化、迭代式开发和团队协作的软件开发方法。它鼓励通过短期...

    ember-cli-rails-源码.rar

    通过深入分析`ember-cli-rails-源码.zip`,我们可以学习到如何在Rails项目中高效地构建、测试和部署Ember应用,理解这两个强大框架的协同工作原理,这对于提升前端开发的效率和质量具有重要意义。

    Ruby on Rails Tutorial 3 源码

    本教程聚焦于 "Ruby on Rails Tutorial 3" 的源码,这个版本对应于 Ruby 2.2.1 和 Rails 4.2.6 的环境。在这个环境中,开发人员可以学习如何利用 Rails 的强大功能来开发实际的应用。 首先,Ruby 2.2.1 是一个稳定...

    使用Aptana+Rails开发Rails Web应用(中文)

    安装过程中,遵循提示进行,确保选择自定义安装并勾选Rails相关的插件,以便在Aptana中获得对Rails的全面支持。 安装完成后,打开Aptana Studio,创建一个新的Rails项目。在“File”菜单中选择“New”然后点击...

    Rails 中mongrel的安装

    在Rails项目中安装Mongrel通常通过RubyGems进行,这是一个Ruby的包管理器。首先确保RubyGems已经安装,然后在命令行执行以下命令: ```bash gem install mongrel ``` 安装完成后,可以通过`mongrel_rails`命令来...

Global site tag (gtag.js) - Google Analytics