中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
基于Ruby的元编程技术(2)
作者:佚名 时间:2007-09-24 16:20 出处:Ruby中文社区 责编:月夜寒箫
              摘要:基于Ruby的元编程技术(2)

现在,有了一系列的访问子(可读和可写),通过instance_variable_set方法,又给每个属性做了初始化。

变量names是在块外部定义的,由于块的闭合性,所以变量names在块中也是有效的。当然,为了程序的演示,又定义的了一个to_s方法,代码如下所示:

            

define_method(:to_s) do

str = "<#{self.class}: "

names.each {|name| str << "#{name}=#{self.send(name)} "}

str + ">"

end

alias_method :inspect, :to_s

完成了这些以后,对于类的构造已经基本结束了,现在就需要真正的从文本文件中读取数据了。从文本文件读数据应该是一个类方法,而不是一个实例的方法,其实现代码如下:

            

def klass.read

array = []

data = File.new(self.to_s.downcase + ".txt")

data.gets #throw away header

data.each do |line|

line.chomp!

values = eval("[#{line}]")

array << self.new(*values)

end

data.close

return array

end

在这个方法中,使用字的类名来匹配相关的文件,比如将Employee类映射到“employee。txt”。然后,从文件中读取职员信息,由于第一行是字段定义,所以要舍弃第一行数据。从第二行开始读取数据,每读取一行数据,则构造一个Employee实例。通过上面这个简单的例子,我们可以看出元编程的功能是相当之强大的,使用元编程技术,可以构造相当简单,优雅的解决方案。

            

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

# "employee.txt" => "Employee"

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)

end

end



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 #throw away header

data.each do |line|

line.chomp!

values = eval("[#{line}]")

array << self.new(*values)

end

data.close

return array

end



return klass

end

end

DataRecord.make("employee.txt")

list = Employee.read

puts list

 

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有