麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Ruby > 正文

ruby元編程之method_missing的一個(gè)使用細(xì)節(jié)

2020-03-29 12:01:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們知道頂級(jí)域,定義域的self是啥?

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

puts self    #main
puts self.class #Object

我們知道當(dāng)一個(gè)方法被調(diào)用的時(shí)候,如果沒(méi)有對(duì)象接受,默認(rèn)就是self,如:
復(fù)制代碼 代碼如下:

def tell_me_who
    puts self
end
tell_me_who  #main

 方法調(diào)用是這樣的步驟,先查找當(dāng)前對(duì)象的所在類(lèi)的實(shí)例方法存在方法與否,如果存在,調(diào)用方法,如果不存在則查看superclass,直到 BasicObject都沒(méi)找到對(duì)于方法的話,就會(huì)調(diào)用Kernel的method_missing()方法,并且報(bào)錯(cuò),如
復(fù)制代碼 代碼如下:

Error:test.rb:8: undefine: undefined local variable or method `ask' for main:Object (NameError)

 注意報(bào)錯(cuò)的信息,我們可以發(fā)現(xiàn),當(dāng)我們調(diào)用一個(gè)不存在的變量的時(shí)候,也是會(huì)追溯到Kernel的method_missing方法的,這里要注意咯。

 

驗(yàn)證:

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

puts self    #main
puts self.class #Object
def self.method_missing(name,*arg)
    puts "#{name} is not exist!"
end
puts ask   #ask is not exist!

 一個(gè)案例導(dǎo)致BUG:
復(fù)制代碼 代碼如下:

def self.method_missing(name,*arg)
    1.times do
        puts method_name=name
    end
    puts "#{method_name} is not exist!"
end

ask #變量或者方法

 

意圖:讓任何未定義的變量或者方法,都打印一次
可是,這是一個(gè)死循環(huán)?看出問(wèn)題了嗎
ask被執(zhí)行,可是沒(méi)有定義ask,就會(huì)轉(zhuǎn)到method_missing,
method_name在times的block中,出了作用域了,所以又會(huì)執(zhí)行method_missing,變成了死循環(huán)。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日本欧美中文字幕 | 欧美一级黄色录像片 | 亚洲一级片在线观看 | 97久久日一线二线三线 | 成年人福利视频 | 福利在线小视频 | 色视频91| 337p粉嫩大胆噜噜噜亚瑟影院 | 91成人影库 | av成人在线电影 | 欧美精品免费一区二区三区 | 一二区电影 | 中国av一级片 | 久久国产精品二国产精品 | 日韩在线激情 | 成年免费观看视频 | 黄色羞羞| 国产在线欧美日韩 | 黄色毛片一级视频 | 国产色视频免费 | 欧美一级免费视频 | 国产精品久久久久久久av | 欧美顶级毛片在线播放小说 | 久久精品性视频 | 91精品动漫在线观看 | 久久久久久久久久久久久九 | 狠狠操电影 | 91色综合综合热五月激情 | 成人国产精品一区二区毛片在线 | 亚洲人成电影在线 | 失禁高潮抽搐喷水h | 在线成人www免费观看视频 | 成人免费网站在线观看 | 国产成人精品午夜视频' | av电影在线观看网站 | 欧美一级毛片美99毛片 | 久久久成人999亚洲区美女 | 爽成人777777婷婷 | 成人在线视频在线观看 | 精品久久久一二三区播放播放播放视频 | 一级成人欧美一区在线观看 |