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

主頁 > 知識庫 > Ruby常量查找路徑問題深入研究

Ruby常量查找路徑問題深入研究

熱門標簽:征服者企業地圖標注 天津外呼系統怎么收費 巫師3地圖標注魔力之所 柯城手機地圖如何做地圖標注 中牟外呼系統違法嗎 外呼線路從哪里出來的 漯河電銷 AI電銷機器人 線路 淮安自動外呼系統供應商

Ruby 的常量查找路徑問題是一直困擾我的一個問題,在工作中遇到過好幾次,一直沒有徹底弄清楚到底為什么,最近在讀一本書《Ruby 元編程》,對 Ruby 對象模型有了更深入的認識,另外讀了一篇 blog《Everything you ever wanted to know about constant lookup in Ruby》, 讓我總算把 Ruby 常量查找路徑這個問題搞得比較清楚。

第一個遇到的問題,我還曾經在 Ruby-China 上發過帖。

復制代碼 代碼如下:

module M1
  CT = "ok"
end

class C1
  CK = "ck"
  include M1

  def self.method1
    puts self
    puts "#{CK} in method1"
    puts "#{CT} in method1"
  end

  class self
    def method2
      puts self
      puts "#{CK} in method1"
      puts "#{CT} in method2"
    end
  end
end

C1.method1
C1.method2

輸出結果是

復制代碼 代碼如下:

C1
ck in method1
ok in method1
C1
ck in method2
NameError: uninitialized constant Class::CT
    from (irb):16:in `method2'

這是我在重構薄荷網代碼時候遇到的問題,method1 和 method2 都是常見的類方法的定義方面,我向來認為它們是等價可替換的寫法,但是從實際執行的結果看,它們里面的常量查找路徑不一樣。

如果我把 M1 的定義改成下面的樣子:

復制代碼 代碼如下:

module M1
  def self.included(base)
    base.extend(self)
  end
  CT = "ok"
end

執行結果是:

復制代碼 代碼如下:

C1
ck in method1
ok in method1
C1
ck in method2
ok in method2

還有一個問題是也是經常遇到的,抽象成問題代碼如下:

復制代碼 代碼如下:

module A
  module M
    def a_method
      #...
    end
  end
end

class A::B
  include M
end

會報異常:

復制代碼 代碼如下:

NameError: uninitialized constant A::B::M
  from (irb):10:in `class:B>'

Ruby 常量查找時依據兩條路徑

A. Module.nesting
B. open class/module 的 ancestors

A 比 B 優先,A 找不到了才到 B 中查找。

A.Module.nesting 的概念比較容易理解,它是指代碼位置的 module 嵌套情況,它是一個數組,從最內層的嵌套一直到最外層的嵌套,如果沒有嵌套,數組為空。任何一處代碼位置都有 Module.nesting 值,可以通過下面的代碼打印出各個位置的 Module.nesting 值。

復制代碼 代碼如下:

p Module.nesting

module A
  module B
    p Module.nesting
    module C
      p Module.nesting
    end
  end
end

module A::B
  p Module.nesting
end

輸出是:

復制代碼 代碼如下:

[]
[A::B, A]
[A::B::C, A::B, A]
[A::B]

大家有沒有注意到,module A::B 這種快捷寫法會導致 A 不在 Module.nesting 里,這就是上述第二個問題的根源,因為 M 是 A module 下的常量,module A::B 寫法導致不會查找 A::M。

說完 A Module.nesting,再說一下 B open class/module 的 ancestors,這個問題相對復雜很多。簡單的說,在 Ruby 代碼的任何位置,都有一個 self 存在,同樣也有一個 open class/module 存在,在模塊和類定義處,它通常就是對應的模塊和類,在方法內部,它是方法對應的類。對于 ancestors,我們可以通過代碼位置 open class/module 的 ancestors 方法取得。

(備注:ancestors 在引入 singleton_class 概念之后變得有點復雜,如不清楚可參考《Ruby 元編程》)

上述第一個問題: 在method1 中 A 是 [C1] open class/module 是 C1,所以 ancestors 是 [C1, M1, Object, Kernel, BasicObject] CK 在 A 可以找到,CT 在 B 可以找到。

method2 中 A 是 [C1] open class/module 是 C1 的 singleton_class , 所以 ancestors 是 [Class, Module, Object, Kernel, BasicObject] CK 在 A 可以找到,CT 在 A 和 B 都找不到。

對于

復制代碼 代碼如下:

module M1
  def self.included(base)
    base.extend(self)
  end
  CT = "ok"
end

可運行,是因為這時,在 method2 中,open class/module C1 的 singleton_class 擴展了 M1,所以 ancestors 變成了 [M1, Class, Module, Object, Kernel, BasicObject]。

至此,這兩個困擾我多時的問題終于徹底搞清楚了。這個過程給我的一個體會是:面對技術上的一些疑問,如果只是淺嘗輒止,是永遠不能夠真正掌握它的,只有深入專研,透徹理解它的原理,才能夠真正掌握它,獲得真正的能力提升。

您可能感興趣的文章:
  • 在Ruby中查找和執行方法
  • Ruby實現的最優二叉查找樹算法
  • Ruby實現二分搜索(二分查找)算法的簡單示例

標簽:甘孜 克拉瑪依 西雙版納 大慶 河池 內江 棗莊 南昌

巨人網絡通訊聲明:本文標題《Ruby常量查找路徑問題深入研究》,本文關鍵詞  Ruby,常量,查找,路徑,問題,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Ruby常量查找路徑問題深入研究》相關的同類信息!
  • 本頁收集關于Ruby常量查找路徑問題深入研究的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人av免费在线观看| 美女视频一区二区| 欧洲一区二区三区在线| 五月综合激情婷婷六月色窝| 91网站在线观看视频| 日本成人在线电影网| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 国产视频一区在线播放| 国产亚洲精品bt天堂精选| 在线播放一区二区三区| 色综合激情五月| 欧美亚洲尤物久久| 欧美日韩国产综合视频在线观看 | 国产午夜精品久久久久久免费视 | 亚洲伦理在线免费看| 日本韩国欧美在线| 一区二区三区久久久| 亚洲一区二区3| 成人小视频在线观看| 精品成人免费观看| 国产精品久久久久影院| 精品一区二区三区免费毛片爱| 欧美中文一区二区三区| 日韩一区和二区| 亚洲天堂中文字幕| www.66久久| 欧美视频日韩视频| 国产精品麻豆久久久| 国产日韩欧美不卡在线| 亚洲国产高清在线观看视频| 亚洲福利一区二区| 岛国精品在线播放| 亚洲国产精品成人综合色在线婷婷 | 91官网在线观看| 中文字幕av在线一区二区三区| 国产精品色婷婷久久58| 韩国女主播成人在线| 日韩欧美在线影院| 亚洲一区二区三区中文字幕在线| 狠狠色丁香婷婷综合| 欧美日韩小视频| 日韩av一区二区三区| 欧美日韩免费电影| 亚洲精品国久久99热| 国产精品亲子伦对白| 国产精品私人影院| 欧美高清你懂得| 欧美人体做爰大胆视频| 精品美女一区二区三区| 欧美国产综合一区二区| 亚洲曰韩产成在线| 蜜臀va亚洲va欧美va天堂| 国产99精品国产| 日韩三级视频在线看| 亚洲色图欧美激情| 亚洲成人你懂的| 色94色欧美sute亚洲13| 成人丝袜高跟foot| 8x8x8国产精品| 99久久精品久久久久久清纯| 欧美无砖专区一中文字| 亚洲伦理在线精品| 国产在线国偷精品免费看| 精品国产乱码久久久久久牛牛| 日本亚洲最大的色成网站www| 欧美日韩一区精品| 国产在线不卡一区| 国产不卡高清在线观看视频| 久久成人综合网| 最新国产成人在线观看| 国产精品一区二区久久不卡| 欧美美女激情18p| 国产精品国产精品国产专区不蜜| 喷水一区二区三区| 日本一区二区三区电影| 国产酒店精品激情| 26uuu亚洲综合色| 久久精品国产亚洲aⅴ| 久久午夜老司机| 国产高清视频一区| 精品视频免费看| 日本少妇一区二区| 欧美在线观看视频一区二区| 一区2区3区在线看| 欧美亚洲综合一区| 美女一区二区在线观看| 欧美变态口味重另类| 高清av一区二区| 日本麻豆一区二区三区视频| 国产偷v国产偷v亚洲高清| 99在线精品视频| 国产一区二区剧情av在线| 久久久久99精品一区| 丁香婷婷综合五月| 国产欧美日韩在线视频| 色综合久久中文综合久久97| 偷拍一区二区三区四区| 欧美蜜桃一区二区三区| 国产大陆精品国产| 国产乱码一区二区三区| 久久综合给合久久狠狠狠97色69| 欧美伊人精品成人久久综合97 | 麻豆国产一区二区| 欧美激情资源网| 综合精品久久久| 国产精品久久久久久久蜜臀| 亚洲国产高清在线| 久久久亚洲精华液精华液精华液 | 国产精品99久| 石原莉奈在线亚洲三区| 亚洲国产成人一区二区三区| 一区二区三区不卡视频在线观看| 91精品国产入口| 欧美日本免费一区二区三区| 91精品国产品国语在线不卡| 国产女人水真多18毛片18精品视频| 亚洲va欧美va人人爽| 亚洲国产日产av| 亚洲午夜久久久久久久久电影网| 欧美老肥妇做.爰bbww| 欧美美女一区二区三区| 久久综合视频网| 午夜精品成人在线视频| 国产不卡免费视频| 捆绑紧缚一区二区三区视频| 国产亚洲欧美在线| 国产99久久久国产精品免费看| 麻豆传媒一区二区三区| 日韩电影网1区2区| 国产高清在线精品| 91老司机福利 在线| 欧美在线三级电影| 国产综合色产在线精品| 日韩专区欧美专区| 成人av动漫网站| 日本视频在线一区| 日本不卡一区二区三区| 国产精品国产三级国产| 国产一区不卡视频| 亚洲成a人在线观看| 欧美性受xxxx黑人xyx| 日本高清视频一区二区| 久久久久久久久久久电影| 中文字幕一区免费在线观看 | 国产一区二区在线电影| 亚洲欧洲美洲综合色网| 亚洲欧美精品午睡沙发| 韩国v欧美v亚洲v日本v| 亚洲精品国产成人久久av盗摄| 日韩欧美中文字幕制服| 亚洲欧洲日产国码二区| 日韩中文欧美在线| 91在线你懂得| 国产精品麻豆一区二区| 国产精品综合一区二区三区| 色偷偷久久人人79超碰人人澡| 国产欧美精品一区二区色综合| www.av亚洲| 亚洲欧洲综合另类在线| 91丨九色丨黑人外教| 亚洲国产精品自拍| 国产乱妇无码大片在线观看| 国产精品成人在线观看| 精品视频1区2区| 日韩精品亚洲一区二区三区免费| 99久久精品国产导航| 欧美精品一级二级| 精品一区二区影视| 亚洲线精品一区二区三区| 国产午夜亚洲精品不卡| 欧美三区在线视频| 97精品超碰一区二区三区| 国产成人在线免费| 国产电影精品久久禁18| 亚洲精品v日韩精品| 国产一区二区福利| 一卡二卡欧美日韩| 亚洲乱码国产乱码精品精可以看| 欧美一区二区在线视频| 91网站最新网址| 国产一区二区在线视频| 亚洲愉拍自拍另类高清精品| 色偷偷成人一区二区三区91| 日韩天堂在线观看| 亚洲国产精品二十页| 国产精品久久久久久久久动漫| 国产精品妹子av| 亚洲一卡二卡三卡四卡无卡久久| 欧美精品一区二区久久婷婷| 国产·精品毛片| 久久久久高清精品| 天堂久久一区二区三区| 91免费视频大全| 日韩欧美一级特黄在线播放| 欧美一区二区三区在线电影| 久久精品国产秦先生| 精品剧情在线观看| 国产黄色成人av| 97久久精品人人澡人人爽| 欧美一区二区三区四区视频 |