欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Meta-Programming in Ruby: 動(dòng)態(tài)生成class,并添加attribute和method。 - AllenYoung - JavaEye技術(shù)網(wǎng)站
Ruby的動(dòng)態(tài)語(yǔ)言特性和強大的meta-programming模型一直是讓我這種Java程序員唏噓感慨??粗?zhù)RoR可以實(shí)現那么多魔術(shù)般的事情而不費吹灰之力,我著(zhù)實(shí)想好好學(xué)學(xué)Ruby的meta-programming??上н@方面資料好像比較少(至少我是沒(méi)有找到什么好的,JavaEye這里討論的也不多),我只能硬著(zhù)頭皮自己慢慢摸索。這篇文章只能算是一個(gè)最簡(jiǎn)單的入門(mén),給大家展示一下Ruby中的meta-programming大概是什么樣子。

下面代碼大概會(huì )做一下事情:
  1. 根據指定的txt文件動(dòng)態(tài)創(chuàng )建一個(gè)class,例如“people.txt”會(huì )被創(chuàng )建為People。
  2. txt文件的第一行是以“,”分隔的字符串,我會(huì )把它們作為class的屬性動(dòng)態(tài)加入class。
  3. 動(dòng)態(tài)聲明class的initialize方法和to_s方法。
代碼如下:
ruby 代碼
 
  1. class MetaProgrammingTest  
  2.     
  3.   # class method,用來(lái)根據給定的文件動(dòng)態(tài)創(chuàng )建一個(gè)新的class。  
  4.   def self.create_class(file_name)  
  5.     # 去掉文件的擴展名.txt,并令首字母大寫(xiě)。例如"people.txt" -> 'People'    
  6.     class_name = File.basename(file_name,".txt").capitalize  
  7.     # 動(dòng)態(tài)創(chuàng )建一個(gè)class,并使用class_name對其命名。  
  8.     klass = Object.const_set(class_name,Class.new)  
  9.       
  10.     # 讀取文件的第一行,并以","為分隔符把每個(gè)token放到數組names中。  
  11.     first_line = ''  
  12.     File.open(file_name) { |io| first_line = io.gets.chomp }  
  13.     names = first_line.split(",")  
  14.       
  15.     # class_eval會(huì )執行其closure中的代碼。  
  16.     klass.class_eval do  
  17.       # 把names數組中所有的字符串聲明為class的attribute。  
  18.       # 注意:這里做了2兩件事情,聲明了這些attribute,并創(chuàng )建了get和set這些attribute的方法。  
  19.       attr_accessor *names  
  20.         
  21.       # define_method用來(lái)定義class的instance method。
  22.       # 參數是方法名,后面的closure是方法體,closure的參數就是方法的參數。  
  23.       define_method(:initializedo |*values|  
  24.         # 對class的每個(gè)attribute,用傳入的參數進(jìn)行賦值。  
  25.         names.each_with_index do |name,i|   
  26.           instance_variable_set("@"+name, values[i])  
  27.         end  
  28.       end  
  29.         
  30.       # 定義to_s方法。  
  31.       # self.class返回當前對象的class(即"People")
  32.       # self.send()得到其參數代表的attribute的值。  
  33.       define_method(:to_sdo  
  34.         str = "[#{self.class}:"  
  35.         names.each {|name| str << " #{name}=#{self.send(name)}" }  
  36.         str + "]"  
  37.       end  
  38.         
  39.     end  
  40.       
  41.     # 返回這個(gè)動(dòng)態(tài)創(chuàng )建的類(lèi)。  
  42.     klass  
  43.   end  
  44.     
  45. end  
  46.   
  47. # 測試代碼  
  48. klass = MetaProgrammingTest.create_class('people.txt') # "people.txt"的內容為"id,name,age"  
  49. klass_instance = klass.new('001', 'Allen Young', 23)  
  50. puts klass_instance.to_s    
  51. # 輸出  
  52. puts klass_instance.inspect
  53. # 輸出#  

怎么樣?真的是非常強大吧。如果什么時(shí)候,Java也能有這么強大的meta-programming就好了
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C -> Cs: What You Need to Know to Move from C to Cs
Meta Programming - Ruby-tw
F#:微軟的下一代重量級語(yǔ)言
[Bernstein09] 10.4. Java Enterprise Edition
三部曲 (評論: Programming Ruby中文版)
ONLamp.com -- Rolling with Ruby on Rails
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久