日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ruby元编程

發(fā)布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ruby元编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

現(xiàn)在關(guān)于Ruby元編程可以說比較熱門,這個隱藏在Ruby背后的特性隨著大家對Ruby的了解逐漸顯現(xiàn)出來啦。這篇文章是自己對Ruby MetPrgamming的理解。

元編程中的元是指元信息(Meta),主要是為其載體提供基本信息,如html頁面中就有meta,如content type說明,SEO等。在C++,Java和Ruby語言中,也有元信息概念,如加載到內(nèi)存中(運行期)的當個對象模型(Class或者Object),都會包含元信息(藍色)和執(zhí)行代碼(灰色):


圖中藍色區(qū)塊表示元信息,C++最少,在C++編譯的過程中,編譯器僅保留了很少的元信息;Java次之,包含了部分元信息;Ruby在解析過程中保留很多信息,所以元信息最多。當然這里不能說C++設(shè)計不合理,C++流行的時候,那個時候內(nèi)存說不定是640K的,硬盤16M的,如果保留過多的信息,那勢必導(dǎo)致程序無法運行,這些設(shè)計都是出于性能的考慮。當然Java在后續(xù)的版本(Java 9,Java 10?)中可能會添加更多的元信息,都不確定,畢竟語言在發(fā)展。

就一個Class來說,這些元信息是什么,如Java,元信息區(qū)塊包括編譯版本號、類名、屬性、函數(shù)方法名、返回值、參數(shù)類型、annotation等等,這個我們可以通過查看Java Class文件得知。對于Ruby來說,元信息則更豐富,如對函數(shù)來說,函數(shù)的參數(shù)名都會保存下來。接下來還有一個關(guān)于元信息的是否可以修改的問題,C++和Java中,這些元信息都是只讀的,你不能更改。一個例子,我們在做Java Debug的時候,如果我們修改函數(shù)內(nèi)部的邏輯,那么hotspot機制可以重新加載該class,但是你給Java Class添加屬性或函數(shù)后,hotspot機制會警告你無法進行新的class加載,這個時候我們需要重新啟動應(yīng)用進行debug。當然也不是絕對的,JavaRebel能夠在修改Java Class結(jié)構(gòu)后,仍能重新加載,其主要是其修改了Java對象模型,不在這里討論。但是Ruby就不一樣拉,元信息不是封閉的,是可以動態(tài)修改的,這樣就可以在運行期調(diào)整其結(jié)構(gòu)。綜合上述的討論,Ruby的元信息豐富,且可以動態(tài)修改,所以我們可以就元信息進行更多的編程,實現(xiàn)某些特殊的功能,而C++和Java在這方面就表現(xiàn)的比較弱一些。

講述了元信息,那么什么是元編程?就是利用元信息進行編碼,也就是你的代碼中包含對元信息的訪問和修改。網(wǎng)上有對元編程的定義為”Write code to write code”(利用代碼去寫代碼),可能不便于理解,如你編寫Maven Plugin或者Velocity模板來生成代碼,這些都不是元編程,因為它們壓根就沒有接觸元信息,就是代碼生成工具而已。在Java中,如果你的代碼訪問了元信息(java.lang.reflect下的類),我們就說你使用了反射機制,反射其實就是Java中的元編程,所以這里將代碼中涉及元信息的操作定義為元編程。在代碼中如何訪問元信息?其實很簡單,有相關(guān)的API,如Java中,java.lang.reflect下的類都是圍繞元信息設(shè)計的。在Ruby中,和Java一樣,有相關(guān)的函數(shù),如instance_methods、class_eval, instance_eval, define_method等等,這些函數(shù)主要負責(zé)訪問和修改元信息,網(wǎng)上有很多文章介紹這些函數(shù)的,不會很難理解。

為何要進行元編程?我們寫代碼主要是為了實現(xiàn)業(yè)務(wù)邏輯,如數(shù)據(jù)庫操作,調(diào)用搜索引擎等,而元編程只是在操作元信息,好像和業(yè)務(wù)邏輯無關(guān),其實不然。我們訪問和修改元信息主要目的有兩個:簡化代碼和實現(xiàn)復(fù)雜邏輯。簡化代碼雖然不直接為業(yè)務(wù)邏輯服務(wù),但是會降低維護成本,如動態(tài)函數(shù)定義等都是這樣的目的;實現(xiàn)復(fù)雜邏輯,舉一個例子,如Java中,我們利用反射機制來實現(xiàn)AOP,這樣一些復(fù)雜的功能(事務(wù)、監(jiān)控統(tǒng)計、Cache、權(quán)限控制等)就非常容易實現(xiàn)。在Ruby中,使用元編程實現(xiàn)的ActiveRecord讓復(fù)雜的數(shù)據(jù)庫操作更加簡單,利用Ruby元編程可以實現(xiàn)各種DSL,如Sinatra就是HTTP的DSL。

我們進行元編程的主要目的是解決業(yè)務(wù)邏輯實現(xiàn)中的技術(shù)問題,所以元編程時有一定的適用場合,不是說利用元編程實現(xiàn)某種奇淫技巧,造成代碼理解困難,增加維護成本,那就不必要啦。元編程也有一些局限性:

1 動態(tài)結(jié)構(gòu)更改可能導(dǎo)致某些不可預(yù)料的錯誤,如程序A按照既定的邏輯編程,而B程序使用元編程,更改了相關(guān)的元信息,導(dǎo)致邏輯不正確,這些都是有的;

2 元編程屬于高級技術(shù),不是一般人能理解,而且不是面向業(yè)務(wù)的,使用不好反而會增加維護成本;

3 對IDE工具不友好,IDE工具對強類型語言,如Java支持非常好。如果你在Ruby中動態(tài)定義一些函數(shù)(如使用class_eval),那么IDE將無法完成這些動態(tài)定義的函數(shù)提示,開發(fā)效率也會降低的,不過不少IDE(如RubyMine)已經(jīng)開始著手解決這些問題。

最后說明一下,元編程并不是某種語言的專利,其實每種語言都包含的這樣的特性,只不過支持的程度不一樣。Ruby設(shè)計的對象模型讓元編程更容易實現(xiàn),而且非常容易實現(xiàn)一些復(fù)雜功能,所以這也成了Ruby的特點,這些特點在Rails的代碼中體現(xiàn)的尤為明顯,甚至到了極致的地步,所以也成就了Rails這款非常優(yōu)秀的框架。

總結(jié)

以上是生活随笔為你收集整理的Ruby元编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美在线视频免费观看 | 精品99在线观看 | 性色av一区二区三区在线观看 | 青青操在线观看视频 | 亚洲乱码国产乱码精品精大量 | 最新激情网站 | 四虎成人精品永久免费av | 人人操日日干 | 182tv午夜 | 久久久久亚洲精品中文字幕 | 日本亚洲最大的色成网站www | 毛片基地视频 | 在线99视频 | 九九人人| 亚洲色图欧洲色图 | 青青草亚洲 | 国产乱淫av麻豆国产免费 | 少妇av片 | 欧美大肚乱孕交hd孕妇 | 日本精品在线观看 | 免费一级黄色片 | 大地资源中文第三页 | 韩国伦理av | 成人深夜视频在线观看 | 日少妇视频 | 久久伊人亚洲 | 丰满少妇一区二区 | 国产999精品视频 | 色综合网址 | 久久dvd| 国产精品久久亚洲7777 | 黑人玩弄人妻一区二区三区 | 黄色茄子视频 | 影音先锋中文字幕第一页 | 午夜不卡影院 | 日韩美女啪啪 | www.av天天 | 久久综合精品国产二区无码不卡 | 动漫3d精品一区二区三区乱码 | 黄色性网站 | 国产又粗又大又爽视频 | 拔插拔插海外华人永久免费 | 免费观看在线视频 | 99爱在线视频 | 性欧美videos另类艳妇3d | 日韩精品无码一本二本三本色 | 亚洲av无码乱码国产精品fc2 | 国产 丝袜 欧美中文 另类 | 国产精品jizz在线观看无码 | 国产偷人 | 国产91在线观看 | 五月婷婷综 | 免费看欧美一级片 | 成人精品视频一区二区三区尤物 | 色在线影院 | 国产人妖一区二区 | 日本激情电影 | 色播放| 亚洲天堂美女视频 | 色图在线观看 | 91久久久久久久久久久 | 欧美日韩激情一区 | a级片视频网站 | 69人妻精品久久无人专区 | 亚洲欧美日本韩国 | 美女扒开腿让人桶爽原神 | 天天射综合网站 | 国产精品一区二区三区线羞羞网站 | 中文字幕第8页 | 亚洲理论在线 | free性满足hd国产精品久 | 神马午夜伦理 | 久久久久久久麻豆 | 色多多av | 欧美三级韩国三级日本三斤 | 久久综合精品国产二区无码不卡 | 蜜桃麻豆视频 | 无码精品a∨在线观看中文 福利片av | 天堂伊人 | 五月婷婷六月天 | 亚洲最大的成人网 | 欧美一级一区 | 国产精品亚洲五月天丁香 | 成人欧美一区二区三区黑人一 | 国产精品入口夜色视频大尺度 | ww成人| 亚洲精品乱码久久久久久麻豆不卡 | 亚洲丁香| 亚洲a一区二区 | 蜜桃视频中文字幕 | 亚洲成人生活片 | 国产v亚洲| 美脚の诱脚舐め脚视频播放 | 国产专区在线 | 风韵少妇性饥渴推油按摩视频 | 黄a在线| 韩国美女啪啪 | 中文字幕免费一区二区 | 久久久久亚洲精品国产 |