• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Ruby元编程技术详解(Ruby Metaprogramming techniques)

Ruby元编程技术详解(Ruby Metaprogramming techniques)

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了ruby 实例变量,ruby实例,ruby 全局变量,ruby环境变量,ruby 类变量等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

我最近考虑了很多元编程(Metaprogramming)的问题,并希望看到更多这方面技术的例子和讲解。无论好坏,元编程已经进入Ruby社区,并成为完成各种任务和简化代码的标准方式。既然找不到这类资源,我准备抛砖引玉写一些通用Ruby技术的文章。这些内容可能对从其它语言转向Ruby或者还没有体验到Ruby元编程乐趣的程序员非常有用。

1. 使用单例类 Use the singleton-class

  许多操作单个对象的方法是基于操作其单例类(singleton class),并且这样可以使元编程更简单。获得单例类的经典方法是执行如下代码:
sclass = (class << self; self; end) 
</div>
  RCR231建议这样定义Kernel#singleton_class方法:
module Kernel  
  def singleton_class  
    class << self; self; end 
  end 
end 
</div>
  我会在下文使用这个方法。

2. DSL的使用类方法来修改子类 Write DSL's using class-methods that rewrite subclasses

  当你想创建一个DSL来定义类信息时,最常见的问题是怎样表示信息来让框架的其它部分使用。以定义一个ActiveRecord模型对象为例:
class Product < ActiveRecord::Base  
  set_table_name 'produce'   
end 
</div>

  在这个例子中,令人感兴趣的是set_table_name的使用。这是怎么起作用的呢?好吧,这里涉及到一个小魔法。这是一种实现方法:
module ActiveRecord  
  class Base  
    def self.set_table_name name  
      define_attr_method :table_name, name  
    end 
    def self.define_attr_method(name, value)  
      singleton_class.send :alias_method, "original_#{name}", name  
      singleton_class.class_eval do   
        define_method(name) do     
          value  
        end 
      end 
    end 
  end   
end 
</div>

  这里令人感兴趣的是define_attr_method。在这个例子中我们需要获得Product类的单例类,但又不想修改ActiveRecord::Base。通过使用单例类我们达到了这个目的。我们为原来的方法取别名,再定义新的存取器(accessor)来返回值。如果ActiveRecord需要table name就可以直接调用存取器。这种动态创建方法和存取器的技术在单例类是很常见的,特别是Rails。

3. 动态创建class和module Create classes and modules dynamically

  Ruby允许你动态创建和修改class和module。你可以在没有冻结的class或module上做任何修改。特定情况下会很有用。Struct类可能是最好的例子:
PersonVO = Struct.new(:name, :phone, :email)  
p1 = PersonVO.new(:name => "Ola Bini") 
</div>
  这会创建一个新类,并赋给PersonVO,然后创建一个类的实例。从草稿创建新类并定义新方法也很简单:
c = Class.new 
c.class_eval do 
  define_method :foo do 
    puts "Hello World" 
  end 
end 
c.new.foo    # => "Hello World" 
</div>
  除了Struct,还能在SOAP4R和Camping找到轻松创建类的例子。Camping尤其令人感兴趣,因为它有专门的方法创建这些类,被你的controller和view继承。Camping的许多有趣的功能都是用这种方式实现的:
def R(*urls); Class.new(R) { meta_def(:urls) { urls } };   
end 

  这使得可以这样创建controller:
class View < R '/view/(\d+)' 
  def get post_id  
  end 
end 
</div>
  你也可以这样创建module,然后在类中包含module。

4. 使用method_missing来做有趣的事 Use method_missing to do interesting things

  除了闭包(block),method_missing可能是Ruby最强大的特性,也是最容易滥用的一个。用好method_missing的话有些代码会变得超级简单,甚至是不能缺少。一个好的例子(Camping)是扩展Hash:
class Hash 
  def method_missing(m,*a)  
    if m.to_s =~ /=$/  
      self[$`] = a[0]  
    elsif a.empty?    
      self[m]  
    else 
      raise NoMethodError, "#{m}" 
    end 
  end 
end 
</div>
  就可以这样使用hash:
x = {'abc' => 123}  
x.abc # => 123  
x.foo = :baz 
x # => {'abc' => 123, 'foo' => :baz} 
</div>
  如你所见,如果有人调用了一个hash不存在的方法,则会搜索内部集合。如果方法名以=结尾,则会赋给同名的key。

  Markaby中可以找到另一个很好的method_missing技巧。以下引用的代码可以生成任何包含CSS class的XHTML标签:
body do 
  h1.header 'Blog' 
  div.content do 
    'Hellu' 
  end 
end 
</div>
会生成:
代码如下:</div>

您可能想查找下面的文章:

  • Ruby元编程技术详解(Ruby Metaprogramming techniques)
  • Ruby类实例变量、类实例方法和类变量、类方法的区别

相关文章

  • Lua字符串模式匹配函数小结
  • Lua时间转化的几个小例子
  • lua闭包的理解以及表与函数的几种表达方法
  • Lua教程(八):数据持久化
  • lua文件操作详解
  • Lua文件读写详解
  • Lua中的迭代器浅析
  • Lua编程示例(一):select、debug、可变参数、table操作、error
  • Lua中的协同程序详解
  • Lua的函数环境、包实例讲解

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 详解Lua中的数组概念知识
    • Lua教程(一):在C++中嵌入Lua脚本
    • Lua中关于求模与求余的区别介绍
    • Lua实现正序和倒序的文件读取方法
    • Lua的table库函数insert、remove、concat、sort详细介绍
    • Lua中的控制结构(流程控制)简明总结
    • Lua中操作字符串的基本方法整理
    • 使用Lua作为C语言项目的配置文件实例
    • lua操作excel方法分享
    • lua实现的2048小游戏

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有