亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

Ruby和元編程之萬物皆為對象

2020-10-29 19:43:47
字體:
來源:轉載
供稿:網友

開篇

空即是色,色即是空。
空空色色,色色空空,在Ruby語言中,萬物皆為對象。

Ruby是一個面向對象的語言(Object Oriented Language),面向對象的概念比其他語言要貫徹的堅定很多。

Ruby中不存在Java中原始類型數據和對象類型數據之分。大部分Ruby中的的東東都是對象。

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

Ruby中的對象

如果你從其他面向對象的語言轉來,一提到得到一個對象你可能會想到建立一個類,然后建立這個類的實例出來產生一個對象。

在Ruby中這完全是可以的,不過這種先建立類才能獲得對象的過程,聽起來更像是面向類的設計,而不是面向對象的設計。關于類的一些東西放到下回再說。

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

復制代碼 代碼如下:

>> 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中嘗試一下其他數據類型,看看他們的方法和類等等信息。

不只是各種數據類型,方法在Ruby中也是對象, 比如下列例子:

復制代碼 代碼如下:

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

有意思的是,方法對象也是有方法的:

復制代碼 代碼如下:

>> one_plus.arity()
=> 1

對象到底是什么?

到底什么是對象呢?

簡單的說,**對象就是 狀態 + 行為**

狀態 就是表明當前對象所擁有的屬性,每個同類的對象可能有不同的狀態,這些狀態保存在實例變量里面(Instance Variable).

對象的實例變量可以由instance_variable_set/instance_variable_get來設定/讀?。?br />

復制代碼 代碼如下:

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

行為 行為就是作用在對象上的動作,就是我們常說的方法。Ruby方法的調用,類似于smalltalk或者Objectiv-C,采用消息模式。調用方法相當于對這個對象發送了一個消息。所以對方法的調用也可以這樣:

在Ruby中,狀態,也就是實例變量是保存在對象里的,而行為或方法則是存在于對象的類或者mixin的module里面。

在靜態語言中,編譯時就會確定所調用的方法是否存在,不存在會產生編譯錯誤。

Ruby中,當我們在方法調用的運行時,對象會查找他隸屬的類,module,父類等,來找到相對應的方法。

Singleton/Meta/Anonymous/Ghost/Shadow Class

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

上面的這些東東其實說的都是一個東西,我喜歡叫它 影子類。

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

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

當一個對象的方法被調用時,首先查找的是影子類,之后才是它所屬的類。

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

這樣的方法只存在于這個對象上,同一個類的其他對象沒有這個方法,因為他們的影子類不同,其他對象的影子類上沒有這個方法。

復制代碼 代碼如下:

>> 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里面一切都是對象,self也是對象,確切地說是當前對象的引用。

前文說Ruby的方法調用是消息模式,比如obj.method, 消息的接受者是.之前的對象,.之后的是方法及參數。
如果對象和.沒有出現的話,消息會被默認送到self對象。除了作為方法的默認接受者,self也是實例變量的解析對象。

self在ruby一開始的時候,被設定為一個叫做main的對象,再irb里面可以看到:

復制代碼 代碼如下:

>> m = self
=> main

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

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

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

當我們用obj.method調用方法時,接下來的時間代碼的執行就會到相應的方法里,運行的上下文切換到那個對象,self自然也變成了那個對象。用def定義單例方法時,道理也是相通的。 下面的例子可以說明這個self切換的情況。

復制代碼 代碼如下:

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

對象的復制

前文說對象的存在包括兩部分,一是狀態/實例變量,另一個是行為,本回專注講了單例方法和影子類。
Ruby中對象的復制也有兩種模式,一個是只復制當前的狀態/實例變量 dup。另外一種是連同影子類和引用的對象一起復制,從而把單例方法也復制一份。

復制代碼 代碼如下:

>> 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

其實有本回上述的這些功能,即便是沒有class,Ruby也可以作為一種Prototype(類似JavaScript)的面向對象語言了。

你可以建立一個對象,生成默認的實例變量,把行為作為單例方法定以在這個對象的影子類上,然后用clone生成千千萬萬個實例。當然這樣比較麻煩,但卻是可行的途徑之一。

其他Object API

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

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

例如關于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.

本回完

本回講了些對象相關的東西,有的很基礎,有的是Ruby自身的一些特性。

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

且聽下回分解

下回注重一些關于類的故事。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区中文字幕| 精品国产31久久久久久| 91精品国产自产在线老师啪| 欧美性少妇18aaaa视频| 国产日韩视频在线观看| 97精品国产97久久久久久| 成人黄色片网站| 国产综合在线看| 久久成人这里只有精品| 欧美成人一区在线| 欧美精品精品精品精品免费| 欧美日韩国产影院| 久久综合伊人77777蜜臀| 亚洲欧美一区二区精品久久久| 日韩美女视频免费看| 国产精品夜间视频香蕉| 91高清视频免费观看| 久久亚洲春色中文字幕| 亚洲国产精品va在线看黑人| 中文字幕日韩电影| 日韩网站免费观看高清| 欧美成人免费大片| 亚洲国产欧美日韩精品| 国产精品视频公开费视频| 大胆欧美人体视频| 秋霞av国产精品一区| 欧美午夜精品在线| 国产香蕉精品视频一区二区三区| 国产精品中文字幕久久久| 色综合伊人色综合网站| 国产精品亚洲综合天堂夜夜| 久久久视频精品| 91chinesevideo永久地址| 81精品国产乱码久久久久久| 欧美日韩成人精品| 国产精品久久久久久久一区探花| 欧美亚洲日本网站| 久久99热精品这里久久精品| 国内免费久久久久久久久久久| 国产精品盗摄久久久| 亚洲精品综合精品自拍| 国产精品91在线| 亚洲精品色婷婷福利天堂| 78m国产成人精品视频| 久久久国产精品x99av| 狠狠干狠狠久久| 欧美做爰性生交视频| 国语自产精品视频在线看一大j8| 亚洲经典中文字幕| 日韩av在线直播| 国产亚洲xxx| 成年无码av片在线| 性夜试看影院91社区| 亚洲男人的天堂网站| 久久久久这里只有精品| 久久人人看视频| 国产久一一精品| 日韩网站在线观看| 国产精品亚发布| 中文字幕精品www乱入免费视频| 精品国产老师黑色丝袜高跟鞋| 欧美日韩成人在线播放| 在线日韩欧美视频| 欧美一级bbbbb性bbbb喷潮片| 久热99视频在线观看| 亚洲偷熟乱区亚洲香蕉av| 尤物精品国产第一福利三区| 狠狠色狠狠色综合日日五| 亚洲国产女人aaa毛片在线| 精品少妇一区二区30p| 国产成一区二区| 日韩网站在线观看| 亚洲精品久久久久久久久久久久| 亚洲xxx大片| 欧美成年人在线观看| 亚洲成人动漫在线播放| 国产精品999999| 91精品国产99| 久久国产精品久久久久久| 国产日韩精品视频| 国产91成人在在线播放| 国产美女被下药99| 成人久久一区二区| 久久精品国产免费观看| 日韩欧美精品免费在线| 久久久久久久97| 狠狠躁夜夜躁人人躁婷婷91| 欧美午夜视频一区二区| 久久久国产精品亚洲一区| 欧美中文在线视频| 亚洲国产精品久久| 性色av一区二区三区| 亚洲毛片在线看| 国产一区欧美二区三区| 91在线免费观看网站| 欧洲中文字幕国产精品| 成人午夜在线视频一区| 57pao成人永久免费视频| 6080yy精品一区二区三区| 国产精品h在线观看| 久久久www成人免费精品| 亚洲精品美女久久久久| 国产午夜精品一区理论片飘花| 91国产视频在线| 欧美黑人狂野猛交老妇| 色综久久综合桃花网| 成人黄色在线观看| 亚洲精品国精品久久99热| 欧美日韩国产一区中文午夜| 日韩黄色在线免费观看| 亚洲成人亚洲激情| 国产专区精品视频| 亚洲乱码一区av黑人高潮| 亚洲图片欧美日产| 欧美大全免费观看电视剧大泉洋| 欧美日韩一区二区三区在线免费观看| 久久理论片午夜琪琪电影网| 欧美激情欧美激情在线五月| 久久久av网站| 成人做爰www免费看视频网站| 成人国产在线激情| 久久久成人精品| 亚洲天堂久久av| 亚洲欧美色婷婷| 日韩**中文字幕毛片| 国产午夜精品久久久| 亚洲视频电影图片偷拍一区| 亚洲性视频网站| 2025国产精品视频| 欧美极度另类性三渗透| 视频一区视频二区国产精品| 色噜噜久久综合伊人一本| 欧美在线播放视频| 色悠悠国产精品| 亚洲视频国产视频| 亚洲欧美日韩精品久久亚洲区| 日韩视频在线一区| 第一福利永久视频精品| 亚洲一区二区三区sesese| 亚洲视频一区二区| 亚洲精品电影网在线观看| 国产午夜精品全部视频在线播放| 亚洲精品99久久久久中文字幕| 综合国产在线观看| 97精品伊人久久久大香线蕉| 热re99久久精品国产66热| 欧美日韩中文字幕综合视频| 精品国产一区二区三区四区在线观看| 欧美激情精品久久久久久免费印度| 欧美精品www在线观看| 国产精品福利无圣光在线一区| 久久中文字幕国产| 91国语精品自产拍在线观看性色| 午夜精品视频在线| 亚洲欧美成人在线| 欧美日韩激情视频8区| 成人网在线视频| 亚洲最大中文字幕| 亚洲а∨天堂久久精品9966| 国产成人激情小视频| 国产精品91在线观看| 日韩国产欧美精品一区二区三区| 欧美日韩国产中文精品字幕自在自线| 精品国产依人香蕉在线精品|