關(guān)于完全聽(tīng)不懂 Ruby 元編程在說(shuō)什么的事(零)

元 (meta-) 是什么边翁?

很難用一個(gè)中文的詞匯來(lái)概括英文中 meta- 詞綴的含義鸵赖。如果我們?nèi)フ疫@個(gè)詞綴詞語(yǔ)的翻譯的話臀玄,也很難找到究竟是什么時(shí)候,開(kāi)始將這一類詞翻譯成「元XX」的嫁乘。但我們可以看到的是,這一類詞通常都很難翻譯球碉,比如說(shuō) physics 物理蜓斧,metaphysics 形而上學(xué);morphological 形態(tài)的 metamorphosis 質(zhì)變睁冬。

對(duì)于這個(gè)詞挎春,我認(rèn)為有個(gè)非常有趣的英語(yǔ)翻譯,是捷克小說(shuō)家卡夫卡的著名小說(shuō)《Die Verwandlung》(變形記)的英語(yǔ)翻譯《The Metamorphosis》豆拨。因?yàn)榈抡Z(yǔ) Verwandlung 本身更接近于 change, transformation 的意思直奋,而 metamorphosis 更突出了變化的徹底性,更體現(xiàn)了主人公格里高爾變成跳蚤之后個(gè)人施禾、家人脚线、社會(huì)對(duì)他的全面變化。

meta- 這個(gè)詞綴更類似于關(guān)于 x 的 x 的這么一種感覺(jué)弥搞。比如 metaphysics 在討論的是事物原理本身的原理邮绿,metamorphosis 討論的是變化導(dǎo)致的根本變化。meta- 這個(gè)詞綴源于希臘語(yǔ)前綴 μετ?攀例,意思是 “之后”船逮、“之外”、“之上”粤铭、“之間”挖胃。中國(guó)大陸一般將這個(gè)詞綴的詞翻譯成「元」,而臺(tái)灣地區(qū)通常翻譯成「後設(shè)」或「超」梆惯。

在討論元編程之前酱鸭,我們不如先討論一下,元概念是如何被用于其它創(chuàng)作性工作的垛吗,這樣我們可以更好理解元編程凹髓,以及如何將元編程用于編程工作之中。

將元用于文學(xué)性創(chuàng)作

塞萬(wàn)提斯的《堂吉訶德》通常被認(rèn)為是最早的元小說(shuō)之一职烧。故事發(fā)生在已經(jīng)沒(méi)有騎士的年代扁誓,主角堂吉訶德幻想自己是一個(gè)騎士防泵。這種在小說(shuō)作品中創(chuàng)作的形式就可以被認(rèn)為是元小說(shuō)蚀之。更嚴(yán)格的元小說(shuō)通常是故事中的作家創(chuàng)造另一個(gè)故事或故事中的讀者閱讀一本書(shū),比如《蘇菲的世界》捷泞。

現(xiàn)代和后現(xiàn)代時(shí)期的元小說(shuō)產(chǎn)生的一大特點(diǎn)是足删,故事主角對(duì)自己是故事的一部分這樣的概念具有意識(shí)。這一類作品的特點(diǎn)也很大影響了其它類型作品锁右,包括元電影和元游戲失受。

可交互性更是使得這種自我意識(shí)覺(jué)醒題材的元?jiǎng)?chuàng)作有了更多的創(chuàng)作型讶泰。比如著名獨(dú)立游戲《史丹利的寓言》(The Stanley Parable) 就以玩家與旁白之間的聽(tīng)從與對(duì)抗作為手段,試圖討論游戲本質(zhì)和玩家自我意識(shí)的概念拂到。

將元用于理學(xué)性創(chuàng)作

如果說(shuō)當(dāng)你將元用于文學(xué)性創(chuàng)作時(shí)痪署,你是有意識(shí)地進(jìn)行著元?jiǎng)?chuàng)作;當(dāng)你將元用于理學(xué)性/科學(xué)性的創(chuàng)作的時(shí)候兄旬,你通常是無(wú)意識(shí)的狼犯。就好像相聲中的傳統(tǒng)段子《捧逗爭(zhēng)哏》,就可以稱之為元相聲领铐,只不過(guò)是沒(méi)有人這么叫而已悯森。

大學(xué)數(shù)學(xué)中有一門(mén)有關(guān)形式語(yǔ)言的課程叫范疇論。其實(shí)就是用抽象的方法來(lái)處理數(shù)學(xué)概念也可以稱之為元數(shù)學(xué)绪撵。在計(jì)算機(jī)科學(xué)中瓢姻,元概念的應(yīng)用其實(shí)極其普遍,以至于我們其實(shí)在日常開(kāi)發(fā)中無(wú)數(shù)次使用過(guò)音诈。

當(dāng)我們現(xiàn)在有一個(gè) HTTP 服務(wù)器幻碱,用戶訪問(wèn)服務(wù)器通常都會(huì)返回一個(gè)網(wǎng)頁(yè)。但我們有時(shí)需要返回的是一個(gè)給用戶下載的文件细溅,在這種情況下收班,瀏覽器需要不同的方式來(lái)處理這是個(gè)網(wǎng)頁(yè)還是文件。最常見(jiàn)的就是我們會(huì)通過(guò) HTTP/1.1 的 Headers 中的 Content-Type 來(lái)定義瀏覽器應(yīng)該如何處理收到的數(shù)據(jù)谒兄。而這些 Headers 定義了數(shù)據(jù)本身摔桦,作為一種描述數(shù)據(jù)的數(shù)據(jù),我們就可以稱之為元數(shù)據(jù)承疲。

當(dāng)你設(shè)計(jì)了一門(mén)編程語(yǔ)言邻耕,你需要為它實(shí)現(xiàn)一個(gè)編譯器。而編譯器的一開(kāi)始燕鸽,你需要做一個(gè)語(yǔ)法分析器 (parser)兄世。由于一門(mén)編程語(yǔ)言的語(yǔ)法通常非常復(fù)雜,手動(dòng)定義其中的關(guān)系有時(shí)不那么方便啊研,于是很多時(shí)候我們會(huì)有類似于 yacc 之類的編譯器編譯程序 (compiler-compiler) 來(lái)生成御滩。通常這樣的程序會(huì)允許輸入一個(gè)巴科斯范式 (BNF) 作為語(yǔ)法定義,而巴科斯范式本身就可以被認(rèn)為是一種元編程党远,你在通過(guò)編程實(shí)現(xiàn)編程削解。

Ruby 元編程

我們通常把 Ruby 元編程單獨(dú)拿出來(lái)說(shuō)是因?yàn)?Ruby 可以通過(guò)編程修改 Ruby 語(yǔ)言自己。事實(shí)上沟娱,有這種能力的不止 Ruby 本身氛驮。且不論 Lisp 的各類方言,當(dāng)年 C++ 模板元編程技術(shù)就夠大家喝一大壺济似。如果說(shuō) Ruby 元編程被 Rubyist 經(jīng)常單獨(dú)出來(lái)說(shuō)的原因是矫废,我們可以通過(guò)元編程盏缤,不僅僅是給語(yǔ)言「增加」能力,或者是在 Ruby 上開(kāi)發(fā)一個(gè)「DSL」蓖扑,更多的是依靠 Ruby 本身豐富的語(yǔ)法糖設(shè)計(jì)唉铜,帶來(lái)更好的編程范式和靈活性。

但 Ruby 元編程并非是一個(gè)有益而無(wú)害的東西律杠,錯(cuò)誤地使用元編程會(huì)給代碼可讀性和程序性能帶來(lái)災(zāi)難性的后果打毛。這一系列的文章將通過(guò)介紹 Ruby 元編程來(lái)達(dá)成以下目的:

  • 介紹 Ruby 元編程方法
  • 介紹 Ruby 元編程陷阱
  • 介紹 Ruby 元編程原理
  • 相關(guān)方法在 YARV 中實(shí)現(xiàn)的變化
  • 認(rèn)為 Ruby 不再是魔法
  • 能找到使用元編程技巧的正確場(chǎng)合
  • 比較 Ruby 和其他語(yǔ)言的元編程實(shí)現(xiàn)

寫(xiě)這些文章之前我反復(fù)讀了《Ruby 元編程》和《Ruby 原理剖析》這兩本書(shū),結(jié)合我自己 Ruby 開(kāi)發(fā)的經(jīng)驗(yàn)和實(shí)例俩功,在這系列文章中幻枉,將會(huì)由淺入深地從方法介紹深入到實(shí)現(xiàn)細(xì)節(jié),更系統(tǒng)地就元編程問(wèn)題進(jìn)行討論诡蜓。

本系列文章采取月更熬甫,連載長(zhǎng)度約為十二個(gè)月,每個(gè)月的內(nèi)容大約 1500-3000 字之間蔓罚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末椿肩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豺谈,更是在濱河造成了極大的恐慌郑象,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茬末,死亡現(xiàn)場(chǎng)離奇詭異厂榛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丽惭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)击奶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人责掏,你說(shuō)我怎么就攤上這事柜砾。” “怎么了换衬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵痰驱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞳浦,道長(zhǎng)担映,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任术幔,我火速辦了婚禮另萤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诅挑。我一直安慰自己四敞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布拔妥。 她就那樣靜靜地躺著忿危,像睡著了一般。 火紅的嫁衣襯著肌膚如雪没龙。 梳的紋絲不亂的頭發(fā)上铺厨,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音硬纤,去河邊找鬼解滓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筝家,可吹牛的內(nèi)容都是我干的洼裤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼溪王,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腮鞍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起莹菱,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤移国,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后道伟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迹缀,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜜徽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裹芝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娜汁,死狀恐怖嫂易,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掐禁,我是刑警寧澤怜械,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站傅事,受9級(jí)特大地震影響缕允,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹭越,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一障本、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦驾霜、人聲如沸案训。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强霎。三九已至,卻和暖如春蓉冈,著一層夾襖步出監(jiān)牢的瞬間城舞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工寞酿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留家夺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓伐弹,卻偏偏與公主長(zhǎng)得像拉馋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掸茅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容