• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    基于Ruby的元編程技術(1)

    發布: 2007-6-11 15:27 | 作者: seanhe | 來源: | 查看: 93次 | 進入軟件測試論壇討論

    領測軟件測試網

    元編程并不是一個很新的概念,通常元編程被認為是通過程序來生成程序,如果從這種意義上來考慮,那么lex和yacc以及JavaCC應該都可以算是具有了元編程的概念,在Java中,元編程得到了廣泛的應用。但在Ruby中,元編程的使用變得相當的簡單和容易實現,使用Ruby語言本身來產生Ruby代碼,不需要借助外部的工具,著名的RoR框架就是建立在Ruby元編程的基礎上的?赡苣銓υ幊踢沒什么概念,但是Ruby已經內建了元編程這種機制,所以很有可能,你在不知不覺中就已經使用了Ruby元編程技術為你帶來的方便之處。如下面這段代碼:

    class Person

    attr_reader :name

    end

    你肯定知道:name是和@name相關聯的,但是你不一定清楚它到底是怎么實現的,其實attr_reader方法的實現就是采用了元編程技術,如下面的這段代碼:

    class Module

    def attr_reader(*syms)

    syms.each do |sym|

    class_eval %{def #{sym}  

    @#{sym}

    end

    end  

    end

    end

    看了這段代碼,你應該大概了解元編程的機制了吧,如果你現在還不了解,那么我建議你先認真的學習一下Ruby的反射機制,然后再接下去看這篇帖子,因為下面介紹的內容并不是一杯嬰兒奶粉。

    在Ruby On Rails中,有一個OR映射層,就是動態的從一張關系表映射到一個對象,這主要由ActiveRecord類來實現。在OR映射模型中,將關系數據庫中的關系表映射到對象模型時,將關系表的表名映射到類名,表中的每一個元組映射到對應于這個類的一個對象,元組的一個字段對應于對象的一個屬性。

    假如我們有一個保存職員基本信息的文件,文件的格式是這樣的:第一行是文件內容的每個字段的名稱,從第二行開始,則是每個職員的基本信息,F在我們有一個文件名為“employee.txt”的文件,其內容如下所示:

    name,age,gender

    "John", 23, "male"

    "Linclon", 25, "male"

    假設我們就要從這個文本文件中讀取數據,并進行一定的處理。如果是使用C++編程,你首先一定會想到應該定義一個Employee類,然后這個類中有name, age, gender這些成員變量。但是采用這種方法的話,可以發現,如果想在職員信息中加入一個字段,比如部門(department),就不得不修改Employee類的代碼,在Employee類中增加一個“department”成員變量,所以我們的代碼是高度依賴于文件的具體格式,這當然不是一個好的現象。我們希望有一種更簡單和優雅的方案,還有,Ruby動態性提高給我們一個解決方案,但是,我們應該從何下手呢,這就需要Ruby的元編程能力。

    首先,我們想應該有一個職員類,在Rails中,每個關系表的名稱會成為類的名稱,在這里,采用類似的方法,將文本文件的名稱作為類的名稱,在Ruby中,類名同時也是一個常量名,所以第一個字母必須為大寫,我們使用如下的代碼來生成類名。

    class_name = File.basename(file_name, ".txt").capitalize

    # "employee.txt" => "Employee"

    klass = Object.const_set(class_name, Class.new)

    Class.new生成一個新的類,這個類的名稱是匿名的,所以采用const_set操作來綁定一個類名,變量klass是新類型的引用。

    生成了這個類以后,需要想這個類添加姓名,年齡和性別這些屬性,這些屬性的名稱是在文本文件的的第一行中給出的。

    data = File.new(file_name)

    header = data.gets.chomp

    data.close

    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

    #...   

    end  


    共2頁: 1 [2] 下一頁

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>