国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Ruby常量查找路徑問(wèn)題深入研究

2019-10-26 19:25:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

第一個(gè)遇到的問(wèn)題,我還曾經(jīng)在 Ruby-China 上發(fā)過(guò)帖。
代碼如下:
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

輸出結(jié)果是

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

這是我在重構(gòu)薄荷網(wǎng)代碼時(shí)候遇到的問(wèn)題,method1 和 method2 都是常見(jiàn)的類方法的定義方面,我向來(lái)認(rèn)為它們是等價(jià)可替換的寫(xiě)法,但是從實(shí)際執(zhí)行的結(jié)果看,它們里面的常量查找路徑不一樣。

如果我把 M1 的定義改成下面的樣子:
代碼如下:
module M1
  def self.included(base)
    base.extend(self)
  end
  CT = "ok"
end

執(zhí)行結(jié)果是:
代碼如下:
C1
ck in method1
ok in method1
C1
ck in method2
ok in method2

還有一個(gè)問(wèn)題是也是經(jīng)常遇到的,抽象成問(wèn)題代碼如下:
代碼如下:
module A
  module M
    def a_method
      #...
    end
  end
end

class A::B
  include M
end

會(huì)報(bào)異常:
代碼如下:
NameError: uninitialized constant A::B::M
  from (irb):10:in `<class:B>'

Ruby 常量查找時(shí)依據(jù)兩條路徑

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

A 比 B 優(yōu)先,A 找不到了才到 B 中查找。

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

代碼如下:
p Module.nesting

module A
  module B

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永善县| 贵溪市| 临夏市| 新郑市| 松滋市| 栾川县| 太和县| 册亨县| 尼勒克县| 龙门县| 龙口市| 东阿县| 江陵县| 临澧县| 辰溪县| 铅山县| 黑龙江省| 兴义市| 桓仁| 保山市| 普宁市| 林西县| 大冶市| 罗山县| 邯郸县| 曲阜市| 凤山市| 特克斯县| 惠安县| 余庆县| 鄂托克前旗| 曲水县| 聂拉木县| 扶绥县| 巨野县| 柳河县| 桃源县| 连平县| 珠海市| 长宁县| 农安县|