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

一个简单的ruby Metaprogram的例子

    博客分类:
  • ruby
阅读更多
比如下面一个文件 people.txt

引用
name,age,weight,height
"Smith, John", 35, 175, "5'10"
"Ford, Anne", 49, 142, "5'4"
"Taylor, Burt", 55, 173, "5'10"
"Zubrin, Candace", 23, 133, "5'6"


我们的目标是什么呢?我们的目标就是实现类似于Rails中的Builder模块所做的事情,假设我们第二行数据 对象为a,那么我们可以通过a.name,a.age等等来得到他所对应的值:

class DataRecord    
      def self.make(file_name)
        data = File.new(file_name)
        header = data.gets.chomp
        data.close
#首先得到文件名,然后根据文件名动态的创建此文件对应的类
        class_name = File.basename(file_name,".txt").capitalize  
        klass = Object.const_set(class_name,Class.new)
        names = header.split(",")
#设置实例变量,并且将实例变量赋值
        klass.class_eval do
          attr_accessor *names
          define_method(:initialize) do |*values| 
            names.each_with_index do |name,i| 
              instance_variable_set("@"+name, values[i])
            end
          end   
#当put时能打印出显示更好的结果
          define_method(:to_s) do
            str = "<#{self.class}:"
            names.each {|name| str << " #{name}=#{self.send(name)}" }
            str + ">"
          end
          alias_method :inspect, :to_s
        end   
#读取数据然后将每一行数据都放进一个数组
        def klass.read
          array = []
          data = File.new(self.to_s.downcase+".txt")
          data.gets
          data.each do |line| 
            line.chomp!   
            values = eval("[#{line}]")
            array << self.new(*values)
          end
          data.close
          array
        end  
        klass
      end  
end

DataRecord.make("people.txt")
list = People.read   

p list[1].name 
p list[1].age  


分享到:
评论
3 楼 ahtest 2014-06-30  
赞一下~~
2 楼 java-admin 2011-10-09  
貌似这行出错了 :
instance_variable_set("@"+name, values[i])

我的环境是:
jruby 1.6.2 (ruby-1.8.7-p330) (2011-05-23 e2ea975) (Java HotSpot(TM) Client VM 1.6.0_26) [Windows XP-x86-java]
1 楼 dennis_zane 2008-03-04  
很好的例子

相关推荐

    模板元编程技术pdf

    - **开源项目**:Boost库中的`boost::mpl`(MetaProgram Library)是一个全面展示模板元编程实践的优秀项目。 通过上述知识点的总结,我们可以看出模板元编程是一种强大且灵活的技术,它不仅可以帮助开发者编写更...

    c++模板经典书籍

    C++模板是C++编程语言中的一个重要特性,它允许程序员创建泛型代码,实现代码复用,提升效率并保持灵活性。在"两本很好的讲解c++ template的书"中,我们可以期待深入理解模板的各个方面,包括基本概念、特性和最佳...

    Addison.Wesley.C++.Template.Metaprogramming.LiB.chm

    A metaprogram is a program that generates or manipulates program code. Ever since generic programming was introduced to C++, programmers have discovered myriad "template tricks" for manipulating ...

    C++模板元编程中文扫描PDF 2/2

    无论如何,所有读者都将获得一个可以自由支配的、威力空前的新工具:Boost Metaprogramming Library。 附赠光盘内容包含所有Boost C++ 程序库:Boost Metaprogramming Library及其参考文件,还包含所有随书代码示例...

    monster:现代C ++中的模板元编程(TMP)的艺术

    "monster"项目正是这样一个深入探讨和实践C++ TMP艺术的资源库,它揭示了如何利用 TMP 来解决复杂问题,并展示其在现代C++编程中的应用。 TMP是C++的一个关键特性,它基于模板系统,通过在编译期间创建和操作类型...

    Advanced Metaprogramming in Classic C++, 3rd Edition

    本书不仅为读者提供了一个全面而系统的C++模板编程的介绍,而且作为参考资料,涵盖了从基础到高级的模板技术,包括函数模板和类模板的使用和实现。 在本书中,作者详细阐述了模板元编程(TMP)作为一种技术集合,它...

    C++模板元编程中文扫描PDF 1/2

    C++三大编程方向:面向对象、泛型编程、模板元编程之一的描述专著,分两卷压缩,此为第一卷。 本书是关于C++模板元编程的著作。本书主要介绍Traits和类型操纵、深入探索元函数、整型外覆器和操作、序列与迭代器、...

Global site tag (gtag.js) - Google Analytics