科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件基于Ruby的元编程技术

基于Ruby的元编程技术

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过程序实例介绍了基于Ruby的元编程技术的应用。

作者:Ruby中文社区 来源:Ruby中文社区 2007年9月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

现在,有了一系列的访问子(可读和可写),通过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







查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章