精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

初探 Ruby Metaprogramming

開發 前端 后端
接觸了一段時間得ruby on rails,深深被ror的magic,powerful,elegantly所折服,同時也對ruby這個神奇的語言本身產生了很大的好奇心,而其中最神奇的莫過于ruby 的 Metaprogramming。

51CTO推薦專題:Ruby On Rails開發教程

Classes are open

我們先看一段代碼:

  1. class String 
  2.   def say_hello  
  3.     p "Hello!" 
  4.   end 
  5. end 
  6.  
  7. "Fred".say_hello 

這里我們看到我們reopen了String這個build-in的class,而且添加了一個新的方法say_hello(.NET 3.5中通過擴展方法也實現了這個特性,但ruby的實現更加自然和靈活)這樣使得ruby語言自身提供了很大的可擴展性,而這種從編程語言層面提供的可擴展性為好處體現在兩個方面。

第一,對于ruby語言自身,在其以后的版本中可以對原有類在不破壞原有代碼的基礎之上提供更多更好的方法。.NET 3.5 已經通過擴展方法這個新特性,在原有集合類的方法之外增加了一些新的查詢方法。

第二,對于ruby的使用者,也就是我們這些ruby程序員來說。classes are open,這就意味我們可以更加實現我們一些具體的特殊的需求。例如,我們希望我們應用的程序中的String都可以提供一個encrype的方法,來實現加密。又或者我們對于String類的to_s方法的實現覺得不夠滿意,我們都可以reopen String這個類,然后定義我們的方法。因為ruby的方法查找遵循

”Define a method twice inside the same class, the second method definition takes precedence“

所有我們毋需擔心,我們對于to_s的調用出問題。

前面我說道,ruby的open class比.NET提供的擴展方法更加靈活。而這個靈活體現在我們可以針對一個instance去增加方法,如下

  1. <SPAN style="FONT-FAMILY: 黑體">fred = 'fred' 
  2. def fred.say_hello  
  3.   p 'hello' 
  4. end 
  5.  
  6. fred.say_hello  
  7. </SPAN> 

這樣就滿足了我們對于一些特殊instance的需求。

Definition are active

  1. class Logger  
  2.   if ENV['debug']  
  3.     def log   
  4.       'debug' 
  5.     end 
  6.   else 
  7.     def log  
  8.       'non-debug' 
  9.     end 
  10.   end 
  11. end 

這是一段非常簡單的代碼,但是我們可以看到我們是否定義debug這個ENV對于我們的程序會有完全不一樣的行為。這里也許有人會說靜態語言的條件編譯同樣能完成這樣的任務。那么我們就再看一段代碼

  1. <SPAN style="FONT-FAMILY: 黑體">result = class Fred  
  2.   puts 'Hello' 
  3.   x = 3  
  4. end 
  5.  
  6. puts result  
  7. </SPAN> 

執行這段代碼,我們會看到這樣的輸出結果:

Hello 
3

為什么會輸出Hello呢?因為definition are active,也就是定義本身就是一段可執行的代碼。為什么會輸出3呢?因為ruby中所有的可執行代碼都會有返回值。到這里肯定會有人問,那么class定義中的method呢?你可以試試在irb中定義一個method,你會發現在irb會返回一個nil給你。

但是definition are active在我們實際開發中有什么用呢?那讓我們看一下一個rails的應用

  1. module ActiveRecord  
  2.   class Base  
  3.     def has_many models  
  4.         
  5.     end 
  6.       
  7.     def belongs_to model  
  8.         
  9.     end 
  10.       
  11.   end 
  12. end 
  13.  
  14. class Order < ActiveRecord::Base  
  15.   has_many :items 
  16. end 
  17.  
  18. class Item < ActiveRecord::Base  
  19.   belongs_to :order 
  20. end 

你能想想如果definition aren't activity, 還會有這樣優雅的代碼嗎?

All methods have a receiver

在ruby中,方法的調用是以message的形式發送給相應的instance的。比如說foo.hello(),就是發送hello這個message給foo。這里很多人會好奇,那么如果我在irb上直接定義方法呢?其實ruby里面有一個概念叫top level execution, 它是一個Object的instance叫做main。當你直接在irb中定義一個方法或者執行一個方法(例如puts "hello"),同樣你只是發送了一個message,而這個message的receiver就是top level execution。

ruby代碼的執行是與當前代碼所在context相關,不同的context關聯不同的receiver。也就是當你的代碼在不同的context下執行,由于context關聯的receiver不同也就有了不同的結果。

  1. class Context  
  2.   def name  
  3.     "smith" 
  4.   end     
  5.   p name      
  6.   def hi  
  7.     p name  
  8.   end 
  9. end  
  10. Context.new.hi 

結果為:

"Context"
 "smith"

如果你想知道在你當前context下你方法的receiver,可以通過在當前context下調用self來獲得。

Class are Object

我們都知道一個object有什么樣的行為和屬性是在ruby中由它的class決定。比如

  1. class Person  
  2.   attr_reader :name 
  3.     
  4.   def initialize(name)  
  5.     @name = name  
  6.   end 
  7.     
  8.   def introduce  
  9.     "I'm #{@name}." 
  10.   end 
  11. end 
  12.  
  13. p = Person.new "Dave" 

對于這個例子中,p具有什么樣的行為和屬性是由Person這個class決定的??墒俏覀兛吹綄τ赑erson我們調用了一個new的方法,那么這個new方法是由誰定義的呢?很簡單啊,我們知道p的行為和屬性由它的class也就是Person決定,那么Person的new方法應該也來自它的class。也就是引出了Class對象,Class對象中有兩個new方法,一個是class method另一個是instance method。我們的Person.new自然調用的就是Class對象中叫new的instance method, 那么那個叫做new的class method有什么用呢?

  1. Person = Class.new do 
  2.   attr_reader :name 
  3.     
  4.   def initialize(name)  
  5.     @name = name  
  6.   end 
  7.     
  8.   def introduce  
  9.     "I'm #{@name}." 
  10.   end 
  11. end 

這段代碼可以實現之前那段代碼一摸一樣的功能,而這里調用的就是Class中叫做new的class method。最奇怪的Class的superclass是Module,而Module的superclass是Object,但是Class的class是自身,Module的class是Class,而Object的class也是Class(superclass是Class的方法,class是Object的方法),我們也可以說ruby中所有的Object的class都是Class(nil的class是NilClass,但是NilClass的class是Class)。Class間接繼承Object,但是Object的class又是Class,一個典型“雞生蛋,蛋生雞”的問題。這個問題給我最大困惑則是:如果我調用一個對象例如上面例子中p的XX方法,而這個XX方法并沒有直接在Person中定義,那么這個XX方法是來自Class還是Object呢?而對于這一點ruby的解決辦法是在方法的查找receiver的時候,會先檢查Person有沒有這個XX方法,會先檢查Class后檢查Object,也就是先檢查一個class的class,然后檢查superclass。
 

原文鏈接:http://www.cnblogs.com/feihe/archive/2011/04/17/1951274.html

【編輯推薦】

  1. 關于Ruby/RoR我的體驗和看法
  2. 橫向壓力測試:Ruby on Rails PK CakePHP
  3. 在Nginx上運行Ruby on Rails
  4. 解讀Ruby on Rails的成功秘籍
  5. 加速Ruby on Rails 消除N+1查詢問題
責任編輯:陳貽新 來源: Fei He's Blog
相關推薦

2016-10-11 13:48:41

WebGLJavascriptWeb

2010-06-03 12:57:06

Hadoop

2009-06-24 13:22:27

Glassfish

2009-12-18 11:22:34

Ruby source

2011-05-17 14:11:06

Dijkstra

2014-11-20 15:44:40

Apple Watch

2015-01-21 16:35:49

Apple WatchWatchKit

2012-02-29 15:03:30

2009-12-18 11:37:54

Ruby關鍵字yiel

2014-11-05 11:05:15

Ruby

2012-04-05 13:50:38

Java

2011-08-24 09:30:29

JavaJVM

2012-07-09 10:22:28

Mono for An

2021-04-14 09:33:58

Kubernetes通信網絡模型

2013-04-10 11:23:27

2013-09-09 09:41:34

2011-06-16 10:25:29

AndroidAIR

2011-09-14 14:15:25

IBMAIX 7操作系統

2017-05-29 08:18:11

Serverless架構軟件系統

2025-08-05 01:55:00

JavaSPI機制
點贊
收藏

51CTO技術棧公眾號

亚洲欧洲第一视频| 国产精品国产三级国产a | 男人天堂资源在线| 亚洲欧美日本国产专区一区| 在线成人激情视频| 麻豆网站免费观看| heyzo一区| 国产欧美一二三区| 超碰97人人人人人蜜桃| 在线能看的av| 欧美美女一区| 欧美精品久久久久久久多人混战| 久艹在线免费观看| 91大神在线网站| 成人丝袜高跟foot| 国产精品久久久av| 日韩精品久久久久久久| 91久久电影| 亚洲美女视频网站| 极品人妻一区二区| 91综合国产| 午夜久久福利影院| 在线观看免费91| 日韩欧美在线观看一区二区| 国产成人免费视频一区| 国产精品高潮粉嫩av| 精品无码人妻一区二区三| 日韩欧美二区| 亚洲欧美国产精品va在线观看| 精品国产午夜福利在线观看| 天然素人一区二区视频| 亚洲成va人在线观看| 青少年xxxxx性开放hg| 美女做暖暖视频免费在线观看全部网址91 | 成年丰满熟妇午夜免费视频| 啊v在线视频| 91视频国产资源| 国产高清不卡av| 国产探花精品一区二区| 日韩av中文在线观看| 欧美亚洲成人网| 精品深夜av无码一区二区老年| 91精品国产乱码久久久久久 | 日韩人妻无码一区二区三区| 高清日韩欧美| 精品奇米国产一区二区三区| 看看黄色一级片| 成人a在线观看高清电影| 韩曰欧美视频免费观看| 少妇高潮毛片色欲ava片| 欧美大片黄色| 一区二区三区资源| 国产精品免费看久久久无码| 超碰在线观看免费版| 1024国产精品| 一区二区三区一级片| 快射av在线播放一区| 亚洲欧洲精品成人久久奇米网| 一区二区三区欧美在线| 素人av在线| 国产精品伦理在线| 中文字幕精品一区日韩| 国内外激情在线| 亚洲三级电影全部在线观看高清| 懂色av一区二区三区四区五区| 麻豆视频在线| 亚洲精品中文在线| 国产黄色激情视频| 91桃色在线| 色综合天天性综合| 日本新janpanese乱熟| 91精品国产66| 日韩欧美国产电影| 国产一线在线观看| 亚洲理论电影| 一区二区中文字幕| 成人免费精品动漫网站| 欧美高清一区| 69精品小视频| 日本丰满少妇做爰爽爽| 极品少妇一区二区三区精品视频| 91日本在线观看| 国精产品乱码一区一区三区四区| 99久久综合99久久综合网站| 秋霞久久久久久一区二区| 国内三级在线观看| 综合久久一区二区三区| 青春草国产视频| 日韩免费福利视频| 91精品久久久久久蜜臀| 涩视频在线观看| 色综合综合网| 欧美日韩国产成人高清视频| 91美女免费看| 精品中文字幕一区二区小辣椒 | 美女精品一区最新中文字幕一区二区三区 | 久久91成人| www.日韩视频| 日韩熟女精品一区二区三区| 日韩电影免费一区| 国产精品久久久久久久久免费丝袜| 91在线免费看片| 日韩精品123| 国产精品白丝在线| 大陆极品少妇内射aaaaa| 日本免费一区二区三区等视频| 精品欧美一区二区久久| 国产1区2区在线观看| 国产精品a级| 日本伊人精品一区二区三区介绍| 国产日产亚洲系列最新| 久久天天做天天爱综合色| 国产av不卡一区二区| 竹内纱里奈兽皇系列在线观看| 欧美日韩激情一区| 亚洲一区二区三区综合| 亚洲九九视频| 国产成人精品免高潮在线观看 | 麻豆免费精品视频| 精品欧美一区二区久久久伦| 国产区在线看| 在线观看成人免费视频| 少妇一级淫片免费放播放| 婷婷综合伊人| 国产精品久久二区| 青青草在线免费观看| 亚洲一级二级三级| 日韩av影视大全| jiujiure精品视频播放| 国内精品视频久久| 国产一区二区网站| 国产欧美一区二区精品忘忧草| 久久久999视频| 超碰97久久| 久久99久国产精品黄毛片入口| 中文字幕777| 久久久精品国产99久久精品芒果| 免费不卡av在线| 91麻豆精品激情在线观看最新 | 精品日韩欧美在线| 日韩激情小视频| 麻豆精品一区二区| 性欧美大战久久久久久久免费观看| 在线毛片观看| 日韩va亚洲va欧洲va国产| 国产精品美女毛片真酒店| 国产精品911| 日韩精品一区二区三区电影| 久久精品资源| 日韩亚洲精品电影| 国产一区二区三区中文字幕| 亚洲色图视频免费播放| 婷婷中文字幕在线观看| 亚洲人体av| 亚洲一区亚洲二区亚洲三区| 超碰免费在线播放| 日韩一区二区三区四区五区六区| 亚洲天堂一级片| 国产精品白丝jk黑袜喷水| 国产免费xxx| 一区二区三区在线免费看| 久久久久国色av免费观看性色 | 亚洲美女在线看| 国产免费av一区| 久久久99精品久久| 日本激情综合网| 国产精品久久久久久久久妇女 | 欧美三级电影在线| 欧美有码在线视频| www 日韩| 91麻豆精品国产91久久久久| 成年人av电影| 不卡区在线中文字幕| 自慰无码一区二区三区| 欧美理论在线播放| 亚洲www在线| 成人影音在线| 亚洲欧美自拍一区| 在线观看视频二区| 玉足女爽爽91| 中文字幕一区二区人妻在线不卡| 三级影片在线观看欧美日韩一区二区| 亚洲一区二区三区精品视频| 日韩中文字幕无砖| 欧美一级淫片丝袜脚交| jizz在线观看| 欧美成人r级一区二区三区| 亚洲第一在线播放| 最新国产の精品合集bt伙计| 久久久老熟女一区二区三区91| 美女国产精品| 干日本少妇视频| 欧美大胆视频| 成人性生交大片免费观看嘿嘿视频| 欧美xxx黑人xxx水蜜桃| 亚洲精品自拍视频| 国产精品国产av| 激情成人在线视频| 99热这里只有精品4| 99精品欧美一区二区三区综合在线| 亚洲免费av一区二区三区| 中文一区一区三区免费在线观看| 九九九热999| 在线成人免费| 欧洲成人在线视频| 污片视频在线免费观看| 国产亚洲aⅴaaaaaa毛片| 亚洲高清视频网站| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 美女的奶胸大爽爽大片| 国产亚洲欧美色| 人妻 日韩 欧美 综合 制服| 精品一区中文字幕| 国产91在线免费| 欧美日韩三级电影在线| 日韩影院一区| 西野翔中文久久精品国产| 成人网中文字幕| 三级成人黄色影院| 欧美激情视频一区二区| 1769在线观看| 亚洲午夜久久久久久久| 天天综合网在线观看| 日韩三级免费观看| 在线观看中文字幕码| 欧美午夜视频在线观看| 久久精品美女视频| 亚洲欧美日韩国产中文在线| www亚洲色图| 国产亚洲欧美日韩日本| 一二三不卡视频| 不卡av在线网| 黑森林av导航| 高潮精品一区videoshd| 欧洲在线免费视频| 国产综合色在线视频区| 日韩一区二区三区不卡视频| 日本在线不卡一区| 久久久久久久久久久久久久国产| 99视频在线精品国自产拍免费观看| 日本道在线视频| 久久精品亚洲欧美日韩精品中文字幕| 亚洲国产综合自拍| 成人vr资源| 视频一区视频二区视频三区视频四区国产 | 欧美性天天影视| 一本色道久久88综合亚洲精品ⅰ | 国产视频在线观看网站| 久久久久久久久久久9不雅视频| 亚洲一区影院| 999久久久国产精品| 一本久道久久综合| 欧美黄色大片在线观看| 综合色婷婷一区二区亚洲欧美国产| 久久理论电影| www.-级毛片线天内射视视| 亚洲成人最新网站| 麻豆一区二区三区在线观看| 综合视频在线| 成人在线国产视频| 日韩天天综合| 99精品免费在线观看| 日韩高清一级片| 九九九在线观看视频| 精品一区二区三区免费观看 | 五月天婷婷激情| 91国偷自产一区二区开放时间 | 欧美久久电影| 欧美色蜜桃97| 五月天色婷婷综合| 欧美国产日本| 国产网站免费在线观看| 丝袜脚交一区二区| 亚洲精品成人在线播放| 国产成人免费网站| 中文字幕一区二区三区人妻| 国产欧美日本一区二区三区| 91麻豆精品成人一区二区| 亚洲午夜精品在线| 久久人妻免费视频| 欧美日韩精品一区二区三区蜜桃| 国产免费久久久| 亚洲国产精品成人一区二区| 黄色免费在线播放| 精品国产一区久久久| 男男gaygays亚洲| 2019精品视频| 性欧美video另类hd尤物| 福利精品视频| 精品久久中文| 中国丰满熟妇xxxx性| 久久综合亚州| 中文在线字幕观看| 久久精品一区四区| 青青操国产视频| 91久久线看在观草草青青| 国产一区二区在线不卡| 亚洲精品国精品久久99热一| 日本不卡在线| 91精品国产高清久久久久久91| 韩国精品视频在线观看 | 国产成人鲁鲁免费视频a| 国产成人免费在线观看视频| 亚洲激情一二三区| 日韩一级片中文字幕| 欧美一区二区黄色| 蜜桃视频在线播放| 欧美激情视频在线观看| 欧美与亚洲与日本直播| 国产精品日韩欧美一区二区三区| 欧洲杯什么时候开赛| 日韩 欧美 视频| 麻豆91在线播放免费| 欧美 变态 另类 人妖| 亚洲精品视频观看| 中文字幕理论片| 日韩精品一二三四区| 神马午夜伦理不卡 | 白白色 亚洲乱淫| 欧美手机在线观看| 欧美系列一区二区| 飘雪影视在线观看免费观看 | 亚洲第一会所| 久久99蜜桃综合影院免费观看| 欧美1区2区视频| 午夜剧场高清版免费观看| 国产亚洲成aⅴ人片在线观看| 日韩av电影网址| 精品国产人成亚洲区| caoporn97在线视频| 91精品久久久久久久| 日韩精品中文字幕第1页| 无码人妻h动漫| 99精品视频在线观看| 欧美三级韩国三级日本三斤在线观看| 日韩一区二区三区视频在线观看| 国产综合内射日韩久| 欧美高清视频在线观看mv| 人妻精品无码一区二区三区 | 99视频国产精品免费观看| 久久中文亚洲字幕| 国产野外作爱视频播放| 国产欧美一区视频| 成人h动漫精品一区二区下载| 精品在线观看国产| 男人av在线播放| 久久精品国产精品国产精品污 | 国产日韩欧美视频在线观看| 中文字幕日韩欧美在线视频| 亚洲一区二区三区四区| 秋霞久久久久久一区二区| 日韩av电影免费观看高清完整版| 法国空姐电影在线观看| 欧美性猛交一区二区三区精品| 福利在线视频导航| 国产成人在线视频| 清纯唯美亚洲综合一区| 天天看片天天操| 亚洲男人的天堂av| www精品国产| 久久免费成人精品视频| 欧美亚洲大陆| 日韩精品一区中文字幕| 中文字幕成人网| 91精品国产乱码久久久久| 久久av红桃一区二区小说| www.爱久久| 欧美性大战久久久久xxx| 久久久国际精品| 夜夜嗨av禁果av粉嫩avhd| 欧美美女18p| 欧美aaaaaaaa牛牛影院| 国产又大又黄又粗的视频| 亚洲欧美综合色| 亚洲精品第五页| 日韩暖暖在线视频| 99久久亚洲精品蜜臀| 亚洲最大视频网| 色婷婷综合久久久中文一区二区| 9191在线观看| 99精品国产一区二区| 日韩视频免费| 手机看片日韩av| 日韩欧美www| 国产不卡网站| 无码人妻精品一区二区三区99v| 成人精品高清在线| 中文字幕av在线免费观看| 欧美另类高清videos| 精品在线99| 韩国三级在线播放| 色婷婷av一区二区三区大白胸| 毛片免费不卡| 精品欧美国产| 国产一区二区三区香蕉| 国产成人精品久久| 国产麻豆一区二区三区精品视频| 亚洲一区二区三区四区精品| 富二代精品短视频| 国产鲁鲁视频在线观看特色|