婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > Ruby和元編程之萬(wàn)物皆為對(duì)象

Ruby和元編程之萬(wàn)物皆為對(duì)象

熱門標(biāo)簽:柯城手機(jī)地圖如何做地圖標(biāo)注 外呼線路從哪里出來(lái)的 AI電銷機(jī)器人 線路 天津外呼系統(tǒng)怎么收費(fèi) 漯河電銷 征服者企業(yè)地圖標(biāo)注 淮安自動(dòng)外呼系統(tǒng)供應(yīng)商 巫師3地圖標(biāo)注魔力之所 中牟外呼系統(tǒng)違法嗎

開篇

空即是色,色即是空。
空空色色,色色空空,在Ruby語(yǔ)言中,萬(wàn)物皆為對(duì)象。

Ruby是一個(gè)面向?qū)ο蟮恼Z(yǔ)言(Object Oriented Language),面向?qū)ο蟮母拍畋绕渌Z(yǔ)言要貫徹的堅(jiān)定很多。

Ruby中不存在Java中原始類型數(shù)據(jù)和對(duì)象類型數(shù)據(jù)之分。大部分Ruby中的的東東都是對(duì)象。

所以,想要掌握Ruby和Ruby的元編程,對(duì)象就是第一門必修功課。本回就著重研究一下Ruby中的對(duì)象.

Ruby中的對(duì)象

如果你從其他面向?qū)ο蟮恼Z(yǔ)言轉(zhuǎn)來(lái),一提到得到一個(gè)對(duì)象你可能會(huì)想到建立一個(gè)類,然后建立這個(gè)類的實(shí)例出來(lái)產(chǎn)生一個(gè)對(duì)象。

在Ruby中這完全是可以的,不過(guò)這種先建立類才能獲得對(duì)象的過(guò)程,聽起來(lái)更像是面向類的設(shè)計(jì),而不是面向?qū)ο蟮脑O(shè)計(jì)。關(guān)于類的一些東西放到下回再說(shuō)。

在Ruby中,不存在原始類型的概念,1, 0.3, true/false 甚至 nil都是對(duì)象。比如,你可以在irb中嘗試下面的代碼:

復(fù)制代碼 代碼如下:

>> 1.methods
=> ["%", "odd?", "inspect", "prec_i", "", "tap", "div", "", "clone", ">>", "public_methods", "__send__", "instance_variable_defined?", "equal?", "freeze", "to_sym", "*", "ord", "lcm", "+", "extend", "next", "power!", "send", "round", "methods", …more methods…> "is_a?", "ceil", "[]"]
>> 1.class
=> Fixnum

你可以在irb中嘗試一下其他數(shù)據(jù)類型,看看他們的方法和類等等信息。

不只是各種數(shù)據(jù)類型,方法在Ruby中也是對(duì)象, 比如下列例子:

復(fù)制代碼 代碼如下:

>> one_plus = 1.method(:+)
=> #Method: Fixnum#+>
>> one_plus.class
=> Method
>> one_plus.call(2)
=> 3

有意思的是,方法對(duì)象也是有方法的:

復(fù)制代碼 代碼如下:

>> one_plus.arity()
=> 1

對(duì)象到底是什么?

到底什么是對(duì)象呢?

簡(jiǎn)單的說(shuō),**對(duì)象就是 狀態(tài) + 行為**

狀態(tài) 就是表明當(dāng)前對(duì)象所擁有的屬性,每個(gè)同類的對(duì)象可能有不同的狀態(tài),這些狀態(tài)保存在實(shí)例變量里面(Instance Variable).

對(duì)象的實(shí)例變量可以由instance_variable_set/instance_variable_get來(lái)設(shè)定/讀取:

復(fù)制代碼 代碼如下:

>> 1.instance_variable_set(:@my_var, "world")
=> "world"
>> 1.instance_variable_get(:@my_var)
=> "world"

行為 行為就是作用在對(duì)象上的動(dòng)作,就是我們常說(shuō)的方法。Ruby方法的調(diào)用,類似于smalltalk或者Objectiv-C,采用消息模式。調(diào)用方法相當(dāng)于對(duì)這個(gè)對(duì)象發(fā)送了一個(gè)消息。所以對(duì)方法的調(diào)用也可以這樣:

在Ruby中,狀態(tài),也就是實(shí)例變量是保存在對(duì)象里的,而行為或方法則是存在于對(duì)象的類或者mixin的module里面。

在靜態(tài)語(yǔ)言中,編譯時(shí)就會(huì)確定所調(diào)用的方法是否存在,不存在會(huì)產(chǎn)生編譯錯(cuò)誤。

Ruby中,當(dāng)我們?cè)诜椒ㄕ{(diào)用的運(yùn)行時(shí),對(duì)象會(huì)查找他隸屬的類,module,父類等,來(lái)找到相對(duì)應(yīng)的方法。

Singleton/Meta/Anonymous/Ghost/Shadow Class

1.Singleton Class: 單例類
2.Meta Class:元類
3.Anonymous Class: 匿名類
4.Ghost Class:鬼類
5.Shadow Class: 影子類

上面的這些東東其實(shí)說(shuō)的都是一個(gè)東西,我喜歡叫它 影子類。

Ruby中每一個(gè)對(duì)象都一個(gè)一個(gè)影子類,這個(gè)影子類存在于對(duì)象跟它所屬的類之間:

對(duì)象("obj1") -> 影子類 -> 對(duì)象所屬的類(String)

當(dāng)一個(gè)對(duì)象的方法被調(diào)用時(shí),首先查找的是影子類,之后才是它所屬的類。

上面講到實(shí)例變量存在于對(duì)象內(nèi),方法存在于對(duì)象的類中。
影子類上的方法,就是只有這一個(gè)對(duì)象擁有的方法。這個(gè)方法通常叫做單例方法(Singleton Method)。

這樣的方法只存在于這個(gè)對(duì)象上,同一個(gè)類的其他對(duì)象沒有這個(gè)方法,因?yàn)樗麄兊挠白宇惒煌渌麑?duì)象的影子類上沒有這個(gè)方法。

復(fù)制代碼 代碼如下:

>> a = "obj1"
=> "obj1"
>> def a.hello
>> puts "hello world"
>> end
=> nil
>> a.hello
hello world
=> nil
>> b = "obj2"
=> "obj2"
>> b.hello
NoMethodError: undefined method `hello' for "obj2":String
    from (irb):49
>> a.singleton_methods
=> ["hello"]
>> b.singleton_methods
=> []

Self

Ruby里面一切都是對(duì)象,self也是對(duì)象,確切地說(shuō)是當(dāng)前對(duì)象的引用。

前文說(shuō)Ruby的方法調(diào)用是消息模式,比如obj.method, 消息的接受者是.之前的對(duì)象,.之后的是方法及參數(shù)。
如果對(duì)象和.沒有出現(xiàn)的話,消息會(huì)被默認(rèn)送到self對(duì)象。除了作為方法的默認(rèn)接受者,self也是實(shí)例變量的解析對(duì)象。

self在ruby一開始的時(shí)候,被設(shè)定為一個(gè)叫做main的對(duì)象,再irb里面可以看到:

復(fù)制代碼 代碼如下:

>> m = self
=> main

self可以被認(rèn)為是一個(gè)特殊的變量,它的特殊性在于,你不能給他賦值:
復(fù)制代碼 代碼如下:

>> self = "obj"
SyntaxError: compile error
(irb):77: Can't change the value of self
self = "obj"
      ^

有幾個(gè)辦法可以改變self的值,.(obj.method的.)是其中一個(gè),除了.還有class/module關(guān)鍵字。
本回主要關(guān)注跟對(duì)象相關(guān)的.

當(dāng)我們用obj.method調(diào)用方法時(shí),接下來(lái)的時(shí)間代碼的執(zhí)行就會(huì)到相應(yīng)的方法里,運(yùn)行的上下文切換到那個(gè)對(duì)象,self自然也變成了那個(gè)對(duì)象。用def定義單例方法時(shí),道理也是相通的。 下面的例子可以說(shuō)明這個(gè)self切換的情況。

復(fù)制代碼 代碼如下:

>> a = "obj"
=> "obj"
>> def a.hello_self
>> puts "hello #{self}"
>> end
>> m = self
=> main
>> a.hello_self
hello obj

對(duì)象的復(fù)制

前文說(shuō)對(duì)象的存在包括兩部分,一是狀態(tài)/實(shí)例變量,另一個(gè)是行為,本回專注講了單例方法和影子類。
Ruby中對(duì)象的復(fù)制也有兩種模式,一個(gè)是只復(fù)制當(dāng)前的狀態(tài)/實(shí)例變量 dup。另外一種是連同影子類和引用的對(duì)象一起復(fù)制,從而把單例方法也復(fù)制一份。

復(fù)制代碼 代碼如下:

>> a = "obj"
>> def a.hello_self
>> puts "hello #{self}"
>> end
>> b = a.dup
=> "obj"
>> b.hello_self
NoMethodError: undefined method `hello_self' for "obj":String
    from (irb):90
>> b = a.clone
=> "obj"
>> b.hello_self
hello obj

其實(shí)有本回上述的這些功能,即便是沒有class,Ruby也可以作為一種Prototype(類似JavaScript)的面向?qū)ο笳Z(yǔ)言了。

你可以建立一個(gè)對(duì)象,生成默認(rèn)的實(shí)例變量,把行為作為單例方法定以在這個(gè)對(duì)象的影子類上,然后用clone生成千千萬(wàn)萬(wàn)個(gè)實(shí)例。當(dāng)然這樣比較麻煩,但卻是可行的途徑之一。

其他Object API

對(duì)象還有很多其他的功能,比如可以freeze,另外dup跟clone也有一些其他的引用上面的區(qū)別,dup只復(fù)制引用,clone會(huì)吧引用的對(duì)象也復(fù)制。

這些都可以在Object類(Ruby所有對(duì)象的父類)API上找到,可以查看apidock.com的文檔

例如關(guān)于dup

.dup() produces a shallow copy of obj—the instance variables of obj are copied, but not the objects they reference. dup copies the tainted state of obj. See also the discussion under Object#clone. In general, clone and dup may have different semantics in descendant classes. While clone is used to duplicate an object, including its internal state, dup typically uses the class of the descendant object to create the new instance.

本回完

本回講了些對(duì)象相關(guān)的東西,有的很基礎(chǔ),有的是Ruby自身的一些特性。

其中Ruby對(duì)象模型中最具特色的兩個(gè)特性就是影子類/單例方法和self,最好能深入理解這兩個(gè)概念。

且聽下回分解

下回注重一些關(guān)于類的故事。

您可能感興趣的文章:
  • Ruby元編程的一些值得注意的地方
  • ruby元編程之創(chuàng)建自己的動(dòng)態(tài)方法
  • ruby元編程之method_missing的一個(gè)使用細(xì)節(jié)
  • Ruby元編程之夢(mèng)中情人method_missing方法詳解
  • Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques)
  • Ruby元編程小結(jié)
  • ruby元編程實(shí)際使用實(shí)例
  • Ruby元編程基礎(chǔ)學(xué)習(xí)筆記整理

標(biāo)簽:棗莊 克拉瑪依 河池 大慶 甘孜 西雙版納 南昌 內(nèi)江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Ruby和元編程之萬(wàn)物皆為對(duì)象》,本文關(guān)鍵詞  Ruby,和,元,編程,之,萬(wàn)物,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ruby和元編程之萬(wàn)物皆為對(duì)象》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Ruby和元編程之萬(wàn)物皆為對(duì)象的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久99最新地址| 91精品91久久久中77777| 2023国产精华国产精品| 一区二区三区中文字幕| 亚洲国产精品一区二区久久| 美脚の诱脚舐め脚责91| 成人av在线播放网站| 欧美日韩亚洲综合在线 | 91免费版在线| 91福利小视频| 日韩精品一区二区三区四区| 亚洲欧美色一区| 精品午夜久久福利影院| 国产精品99久久久久久久vr| 国产一区二区美女| 波多野结衣精品在线| 色噜噜狠狠色综合欧洲selulu | www.色综合.com| 日本亚洲欧美天堂免费| 亚洲精品五月天| 久久精品夜色噜噜亚洲aⅴ| 亚洲卡通欧美制服中文| 日日骚欧美日韩| 亚洲精品免费一二三区| 国产精品动漫网站| 久久精品一区二区| 成人av资源网站| 99精品视频中文字幕| 国产黄色成人av| 久久激情五月婷婷| 精品中文av资源站在线观看| 日本欧美一区二区在线观看| 久久99日本精品| 欧美午夜电影在线播放| 欧美日韩国产精品自在自线| 在线免费精品视频| 在线国产电影不卡| 欧美中文字幕亚洲一区二区va在线| 精品一区二区日韩| 777色狠狠一区二区三区| 91极品视觉盛宴| 欧美综合一区二区| 欧美在线你懂的| 欧美视频一区二区三区| 国产麻豆精品theporn| 日韩你懂的在线播放| 欧美电影免费观看高清完整版在线| 日韩一区二区精品| 欧美一区二区不卡视频| 欧美日韩国产综合一区二区| 五月婷婷综合网| 亚洲福利一二三区| 日韩国产欧美在线播放| 亚洲一区二区欧美| 午夜精品久久久久久久久久久 | 国产激情视频一区二区三区欧美| 国产黄色精品视频| 91免费观看在线| 欧美亚洲一区二区在线观看| 欧美日韩免费一区二区三区| 日韩视频免费观看高清完整版在线观看 | 久久蜜桃av一区二区天堂| 日韩视频免费观看高清完整版在线观看| 欧美一级二级三级蜜桃| 久久午夜色播影院免费高清| 国产精品中文有码| 日本一区二区免费在线观看视频 | 国内不卡的二区三区中文字幕| 精品系列免费在线观看| 蜜桃久久久久久| 精品国产123| 综合久久国产九一剧情麻豆| 亚洲国产精品麻豆| 国产激情一区二区三区| 在线观看成人小视频| 天天影视涩香欲综合网| 国产一区二区三区四区在线观看| 亚洲国产成人一区二区三区| 亚洲激情av在线| 美腿丝袜亚洲三区| 亚洲精品免费在线播放| 欧美一区二区三区人| 国产欧美一区二区在线| 婷婷六月综合网| 成人性生交大片免费看在线播放 | 日韩美女视频一区二区在线观看| 国产经典欧美精品| 在线免费视频一区二区| 久久一日本道色综合| 亚洲日本护士毛茸茸| 日韩国产精品大片| 色悠久久久久综合欧美99| 日本女优在线视频一区二区| 色婷婷久久久久swag精品| 久久久久国色av免费看影院| 三级不卡在线观看| 色素色在线综合| 国产亚洲精品aa| 另类人妖一区二区av| 欧美午夜精品理论片a级按摩| 国产精品久久久久婷婷| 中文成人av在线| 日韩av电影天堂| 在线观看三级视频欧美| 国产精品久久99| 国产成人精品影院| 色婷婷久久综合| 欧美最猛黑人xxxxx猛交| 国产精品久久久久久久裸模| 国产麻豆91精品| 日韩精品一区二区在线观看| 国产亚洲午夜高清国产拍精品| 欧洲精品视频在线观看| 亚洲女同ⅹxx女同tv| bt7086福利一区国产| 亚洲国产精品精华液2区45| 国产精品免费av| 精品欧美乱码久久久久久| 免费成人在线观看视频| 欧美日本一道本在线视频| 亚洲成人免费视频| 日韩中文欧美在线| 亚洲va国产天堂va久久en| 欧美又粗又大又爽| 亚洲一区二区四区蜜桃| 欧美日韩一区二区三区在线看| 亚洲国产一区二区在线播放| 亚洲日本免费电影| 欧美性高清videossexo| 午夜精品福利在线| 欧美欧美午夜aⅴ在线观看| 日韩精品欧美成人高清一区二区| 亚洲国产婷婷综合在线精品| 欧美久久久久中文字幕| 精品久久久影院| 亚洲欧美日韩电影| 欧美日韩精品一区二区三区四区| 亚洲电影你懂得| 欧美日韩黄色一区二区| 欧美狂野另类xxxxoooo| 蜜臀av一级做a爰片久久| 精品国产污网站| 成人永久免费视频| 欧美日韩不卡在线| 日韩精品一区二区三区视频在线观看 | 精品久久五月天| 日韩高清中文字幕一区| 911精品国产一区二区在线| 欧美国产精品一区二区| 国产亚洲精品7777| 在线视频一区二区三| 免费人成黄页网站在线一区二区| 精品国产三级电影在线观看| 久久99国产精品麻豆| 国产欧美一区二区三区在线老狼| 91在线观看污| 亚洲成人午夜影院| 91小宝寻花一区二区三区| 亚洲欧美在线观看| 在线观看日韩av先锋影音电影院| 蜜臀国产一区二区三区在线播放 | 成熟亚洲日本毛茸茸凸凹| 亚洲欧洲在线观看av| 亚洲精品乱码久久久久久黑人| 欧美一级日韩一级| 99精品欧美一区| 免费在线一区观看| 成人免费在线视频| 午夜国产不卡在线观看视频| 国产精品乱码一区二区三区软件| 在线播放中文一区| 成人动漫视频在线| 国产亚洲污的网站| 夜夜亚洲天天久久| 国产网站一区二区三区| 欧美亚洲动漫精品| 国产成人亚洲综合a∨婷婷图片| 9l国产精品久久久久麻豆| 欧美精品在线一区二区| 成人sese在线| 美女精品一区二区| 亚洲一区二区四区蜜桃| 国产精品素人视频| 精品国产伦一区二区三区免费| 在线观看视频91| 91亚洲国产成人精品一区二区三| 韩国三级中文字幕hd久久精品| 亚洲午夜av在线| 成人av电影在线网| 91精品在线一区二区| 欧美中文一区二区三区| 96av麻豆蜜桃一区二区| 国产成人福利片| 欧美一区二区三区在线观看| 色激情天天射综合网| 成人性色生活片| 激情综合五月婷婷| 欧美日韩成人激情| 欧美性大战久久久| 色综合久久99|