成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Ruby元編程構(gòu)造簡(jiǎn)單優(yōu)雅解決方案

開(kāi)發(fā) 開(kāi)發(fā)工具
雖然,元編程是從Java中得到的廣泛推廣,但是,Ruby元編程給我們帶來(lái)了簡(jiǎn)便靈活的應(yīng)用。幫助我們?cè)趯?shí)際編程應(yīng)用中獲得大量的方便之處。

Ruby語(yǔ)言雖然比較新穎,其編寫(xiě)方式和一些特性于其他常見(jiàn)語(yǔ)言不盡相同,但是一些編程語(yǔ)言特有的屬性是不會(huì)改變的,比如Ruby元編程。#t#

元編程并不是一個(gè)很新的概念,通常元編程被認(rèn)為是通過(guò)程序來(lái)生成程序,如果從這種意義上來(lái)考慮,那么lex和yacc以及JavaCC應(yīng)該都可以算是具有了元編程的概念,在Java中,元編程得到了廣泛的應(yīng)用。

但在Ruby中,Ruby元編程的使用變得相當(dāng)?shù)暮?jiǎn)單和容易實(shí)現(xiàn),使用Ruby語(yǔ)言本身來(lái)產(chǎn)生Ruby代碼,不需要借助外部的工具,著名的RoR框架就是建立在Ruby元編程的基礎(chǔ)上的。可能你對(duì)元編程還沒(méi)什么概念,但是Ruby已經(jīng)內(nèi)建了元編程這種機(jī)制,所以很有可能,你在不知不覺(jué)中就已經(jīng)使用了Ruby元編程技術(shù)為你帶來(lái)的方便之處。如下面這段代碼:

 

  1. class Person  
  2. attr_reader :name  
  3. end 

你肯定知道:name是和@name相關(guān)聯(lián)的,但是你不一定清楚它到底是怎么實(shí)現(xiàn)的,其實(shí)attr_reader方法的實(shí)現(xiàn)就是采用了Ruby元編程技術(shù),如下面的這段代碼:

 

  1. class Module  
  2. def attr_reader(*syms)  
  3. syms.each do |sym|  
  4. class_eval %{def #{sym}   
  5. @#{sym}  
  6. end  
  7. end   
  8. end  
  9. end 

看了這段代碼,你應(yīng)該大概了解Ruby元編程的機(jī)制了吧,如果你現(xiàn)在還不了解,那么我建議你先認(rèn)真的學(xué)習(xí)一下Ruby的反射機(jī)制,然后再接下去看這篇帖子,因?yàn)橄旅娼榻B的內(nèi)容并不是一杯嬰兒奶粉。

在Ruby On Rails中,有一個(gè)OR映射層,就是動(dòng)態(tài)的從一張關(guān)系表映射到一個(gè)對(duì)象,這主要由ActiveRecord類來(lái)實(shí)現(xiàn)。在OR映射模型中,將關(guān)系數(shù)據(jù)庫(kù)中的關(guān)系表映射到對(duì)象模型時(shí),將關(guān)系表的表名映射到類名,表中的每一個(gè)元組映射到對(duì)應(yīng)于這個(gè)類的一個(gè)對(duì)象,元組的一個(gè)字段對(duì)應(yīng)于對(duì)象的一個(gè)屬性。

假如我們有一個(gè)保存職員基本信息的文件,文件的格式是這樣的:第一行是文件內(nèi)容的每個(gè)字段的名稱,從第二行開(kāi)始,則是每個(gè)職員的基本信息。現(xiàn)在我們有一個(gè)文件名為“employee.txt”的文件,其內(nèi)容如下所示:

 

  1. name,age,gender  
  2. "John", 23, "male"  
  3. "Linclon", 25, "male" 

 

假設(shè)我們就要從這個(gè)文本文件中讀取數(shù)據(jù),并進(jìn)行一定的處理。如果是使用C++編程,你首先一定會(huì)想到應(yīng)該定義一個(gè)Employee類,然后這個(gè)類中有name, age, gender這些成員變量。但是采用這種方法的話,可以發(fā)現(xiàn),如果想在職員信息中加入一個(gè)字段,比如部門(mén)(department),就不得不修改Employee類的代碼,在Employee類中增加一個(gè)“department”成員變量,所以我們的代碼是高度依賴于文件的具體格式,這當(dāng)然不是一個(gè)好的現(xiàn)象。

我們希望有一種更簡(jiǎn)單和優(yōu)雅的方案,還有,Ruby動(dòng)態(tài)性提高給我們一個(gè)解決方案,但是,我們應(yīng)該從何下手呢,這就需要Ruby元編程能力。

首先,我們想應(yīng)該有一個(gè)職員類,在Rails中,每個(gè)關(guān)系表的名稱會(huì)成為類的名稱,在這里,采用類似的方法,將文本文件的名稱作為類的名稱,在Ruby中,類名同時(shí)也是一個(gè)常量名,所以第一個(gè)字母必須為大寫(xiě),我們使用如下的代碼來(lái)生成類名。

 

  1. class_name = File.basename
    (file_name, ".txt").capitalize  
  2. # "employee.txt" => "Employee"  
  3. klass = Object.const_set
    (class_name, Class.new) 

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

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

 

  1. data = File.new(file_name)  
  2. header = data.gets.chomp  
  3. data.close  
  4. names = header.split(",") 

下面的Ruby元編程代碼給出了如何生成這些屬性,以及初始化這些屬性值。

 

  1. klass.class_eval do  
  2. attr_accessor *names  
  3. define_method(:initialize)
     do |*values|  
  4. names.each_with_index 
    do |name, i|  
  5. instance_variable_set
    ("@" + name, values)  
  6. end  
  7. end  
  8. #...  
  9. end  

現(xiàn)在,有了一系列的訪問(wèn)子(可讀和可寫(xiě)),通過(guò)instance_variable_set方法,又給每個(gè)屬性做了初始化。

變量names是在塊外部定義的,由于塊的閉合性,所以變量names在塊中也是有效的。當(dāng)然,為了Ruby元編程程序的演示,又定義的了一個(gè)to_s方法,代碼如下所示:

 

  1. define_method(:to_s) do  
  2. str = "<#{self.class}: " 
  3. names.each {|name| str << 
    "#{name}=#{self.send(name)} "}  
  4. str + ">"  
  5. end  
  6. alias_method :inspect, :to_s 

完成了這些以后,對(duì)于類的構(gòu)造已經(jīng)基本結(jié)束了,現(xiàn)在就需要真正的從文本文件中讀取數(shù)據(jù)了。從文本文件讀數(shù)據(jù)應(yīng)該是一個(gè)類方法,而不是一個(gè)實(shí)例的方法,其實(shí)現(xiàn)代碼如下:

 

  1. def klass.read  
  2. array = []  
  3. data = File.new(self.
    to_s.downcase + ".txt")  
  4. data.gets #throw away header  
  5. data.each do |line|  
  6. line.chomp!  
  7. values = eval("[#{line}]")  
  8. array << self.new(*values)  
  9. end  
  10. data.close  
  11. return array  
  12. end 

在這個(gè)方法中,使用字的類名來(lái)匹配相關(guān)的文件,比如將Employee類映射到“employee。txt”。然后,從文件中讀取職員信息,由于第一行是字段定義,所以要舍棄第一行數(shù)據(jù)。從第二行開(kāi)始讀取數(shù)據(jù),每讀取一行數(shù)據(jù),則構(gòu)造一個(gè)Employee實(shí)例。通過(guò)上面這個(gè)簡(jiǎn)單的例子,我們可以看出Ruby元編程的功能是相當(dāng)之強(qiáng)大的,使用元編程技術(shù),可以構(gòu)造相當(dāng)簡(jiǎn)單,優(yōu)雅的解決方案。

責(zé)任編輯:曹凱 來(lái)源: ddvip.com
相關(guān)推薦

2009-09-14 10:54:07

LINQ解決方案

2011-03-29 14:35:34

2022-03-01 09:31:06

JWTSession跨域

2021-06-28 08:10:59

JavaScript異步編程

2009-10-27 16:12:40

2012-05-27 16:21:31

IDC華為

2018-12-03 12:17:27

Semptian解決方案

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:13:21

Mellanox解決方案

2018-12-03 12:26:30

YADRO解決方案

2009-12-03 13:51:51

JRubyJBossTorqueBox

2024-09-18 00:15:58

2024-09-20 08:14:16

2016-03-13 17:58:57

2011-01-12 11:12:38

普元平臺(tái)軟件

2016-02-18 15:33:56

融合通信華為

2011-12-09 11:13:17

2009-12-23 21:06:47

統(tǒng)一通信多媒體聯(lián)絡(luò)中心平臺(tái)華為

2016-03-13 17:35:18

2009-07-15 17:09:32

Swing線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人在线视频 | 亚洲精品一区二区三区蜜桃久 | 色婷婷av99xx| 久久91精品久久久久久9鸭 | 午夜精品久久久久久久99黑人 | 日韩高清三区 | 欧美日韩国产一区二区三区 | 成人在线免费观看 | 伊人艹| 亚洲一二三区在线观看 | 午夜小视频在线播放 | 中文字幕人成乱码在线观看 | 中文字幕亚洲欧美日韩在线不卡 | 在线伊人网 | 国产日韩欧美一区二区 | 色呦呦网站 | 国产91在线观看 | 天天影视色综合 | 91精品国产综合久久久久久首页 | 一级毛片成人免费看a | 中文字幕一区二区三区在线观看 | 欧美三级在线 | 一级看片免费视频囗交动图 | 在线四虎| 在线播放中文字幕 | 久久精品日产第一区二区三区 | 欧美男人天堂 | 九九热精品在线视频 | 精品视频一区二区在线观看 | 波多野结衣一二三区 | 91 在线| 国产精品亚洲一区 | 91综合网 | 精品久久国产 | 91视频在线 | 国产视频中文字幕在线观看 | 亚洲精品粉嫩美女一区 | 正在播放国产精品 | 日韩在线免费视频 | 91资源在线 | 欧美一区二区三区久久精品 |