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

首頁 > 編程 > Ruby > 正文

Ruby中鉤子方法的運用實例解析

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

通過使用鉤子方法,可以讓我們在Ruby的類或模塊的生命周期中進行干預,可以極大的提高編程的靈活性。
與生命周期相關的鉤子方法有下面這些:

類與模塊相關

  • Class#inherited
  • Module#include
  • Module#prepended
  • Module#extend_object
  • Module#method_added
  • Module#method_removed
  • Module#method_undefined

單件類相關

  • BasicObject#singleton_method_added
  • BasicObject#singleton_method_removed
  • BasicObject#singleton_method_undefined

示例代碼

module M1  def self.included(othermod)    puts “M1 was included into #{othermod}”  endendmodule M2  def self.prepended(othermod)    puts “M2 was prepended to #{othermod}”  endendclass C  include M1  include M2end# 輸出M1 was included into CM2 was prepended to Cmodule M  def self.method_added(method)    puts “New method: M##{method}”  end  def my_method; endend# 輸出New method: M#my_method

除了上面列出來的一些方法外,也可以通過重寫父類的某個方法,進行一些過濾操作后,再通過調用super方法完成原函數的功能,從而實現類似鉤子方法的功效,如出一轍,環繞別名也可以作為一種鉤子方法的替代實現。

運用實例
任務描述:

寫一個操作方法類似attr_accessor的attr_checked的類宏,該類宏用來對屬性值做檢驗,使用方法如下:

class Person include CheckedAttributes attr_checked :age do |v|  v >= 18 endendme = Person.newme.age = 39 #okme.age = 12 #拋出異常

實施計劃:

使用eval方法編寫一個名為add_checked_attribute的內核方法,為指定類添加經過簡單校驗的屬性
重構add_checked_attribute方法,去掉eval方法,改用其它手段實現
添加代碼塊校驗功能
修改add_checked_attribute為要求的attr_checked,并使其對所有類都可用
通過引入模塊的方式,只對引入該功能模塊的類添加attr_checked方法
Step 1

def add_checked_attribute(klass, attribute) eval "  class #{klass}   def #{attribute}=(value)    raise 'Invalid attribute' unless value    @#{attribute} = value   end   def #{attribute}()    @#{attribute}   end  end "endadd_checked_attribute(String, :my_attr)t = "hello,kitty"t.my_attr = 100puts t.my_attrt.my_attr = falseputs t.my_attr

這一步使用eval方法,用class和def關鍵詞分別打開類,且定義了指定的屬性的get和set方法,其中的set方法會簡單的判斷值是否為空(nil 或 false),如果是則拋出Invalid attribute異常。

Setp 2

def add_checked_attribute(klass, attribute) klass.class_eval do  define_method "#{attribute}=" do |value|   raise "Invaild attribute" unless value   instance_variable_set("@#{attribute}", value)  end  define_method attribute do   instance_variable_get "@#{attribute}"  end endend

這一步更換掉了eval方法,同時也分別用class_eval和define_method方法替換了之前的class與def關鍵字,實例變量的設置和獲取分別改用了instance_variable_set和instance_variable_get方法,使用上與第一步沒有任何區別,只是一些內部實現的差異。

Step 3

def add_checked_attribute(klass, attribute, &validation) klass.class_eval do  define_method "#{attribute}=" do |value|   raise "Invaild attribute" unless validation.call(value)   instance_variable_set("@#{attribute}", value)  end  define_method attribute do   instance_variable_get "@#{attribute}"  end endendadd_checked_attribute(String, :my_attr){|v| v >= 180 }t = "hello,kitty"t.my_attr = 100 #Invaild attribute (RuntimeError)puts t.my_attrt.my_attr = 200puts t.my_attr #200

沒有什么奇特的,只是加了通過代碼塊驗證,增加了校驗的靈活性,不再僅僅局限于nil和false之間了。

Step 4

class Class def attr_checked(attribute, &validation)   define_method "#{attribute}=" do |value|    raise "Invaild attribute" unless validation.call(value)    instance_variable_set("@#{attribute}", value)   end   define_method attribute do    instance_variable_get "@#{attribute}"   end endendString.add_checked(:my_attr){|v| v >= 180 }t = "hello,kitty"t.my_attr = 100 #Invaild attribute (RuntimeError)puts t.my_attrt.my_attr = 200puts t.my_attr #200

這里我們把之前頂級作用域中方法名放到了Class中,由于所有對象都是Class的實例, 所以這里定義的實例方法,也能被Ruby中的其它所有類訪問到,同時在class定義中,self就是當前類,所以也就省去了調用類這個參數和class_eval方法,并且我們把方法的名字也改成了attr_checked。

Step 5

module CheckedAttributes def self.included(base)  base.extend ClassMethods endendmodule ClassMethods def attr_checked(attribute, &validation)   define_method "#{attribute}=" do |value|    raise "Invaild attribute" unless validation.call(value)    instance_variable_set("@#{attribute}", value)   end   define_method attribute do    instance_variable_get "@#{attribute}"   end endendclass Person include CheckedAttributes attr_checked :age do |v|  v >= 18 endend

最后一步通過鉤子方法,在CheckedAttributes模塊被引入后,對當前類通過被引入模塊進行擴展, 從而使當前類支持引入后的方法調用,即這里的get與set方法組。

到此,我們已經得到了一個名為attr_checked,類似attr_accessor的類宏,通過它你可以對屬性進行你想要的校驗。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
夜夜嗨av一区二区三区免费区| 精品国偷自产在线视频99| 好吊成人免视频| 2020国产精品视频| 91国产精品视频在线| 国产欧洲精品视频| 欧美怡红院视频一区二区三区| 九九久久久久99精品| 欧美成年人视频网站欧美| 久久精品国产91精品亚洲| 欧美激情视频播放| 国产精品偷伦免费视频观看的| 国产色婷婷国产综合在线理论片a| 欧美精品videos另类日本| 久久精品99国产精品酒店日本| 亚洲网站视频福利| 日韩高清av一区二区三区| 国产精品扒开腿做爽爽爽视频| 亚洲激情成人网| 欧美成人一区在线| 成人黄色片网站| 国产精品美女视频网站| 欧美精品一区三区| 狠狠躁18三区二区一区| 国产人妖伪娘一区91| 精品国产拍在线观看| 亚洲风情亚aⅴ在线发布| 日韩av电影手机在线观看| 亚洲第一区在线观看| 成人国产精品日本在线| 永久免费精品影视网站| 久久视频免费观看| 亚洲激情视频网| 91成品人片a无限观看| 日本免费久久高清视频| 久久夜色精品国产欧美乱| 欧美自拍大量在线观看| 欧美日韩在线观看视频| 国自产精品手机在线观看视频| 亚洲人成在线电影| 亚洲福利在线看| 午夜精品一区二区三区在线播放| 亚洲综合社区网| 欧美性猛交xxxxx免费看| 精品成人69xx.xyz| 亚洲免费高清视频| 亚洲第一区在线观看| 欧美激情精品久久久久久蜜臀| 色偷偷av一区二区三区| 国产精品久久久久久久久久尿| 日本精品久久久| 亚洲人免费视频| 久久成年人视频| 欧美成人午夜免费视在线看片| 都市激情亚洲色图| 色综合久久天天综线观看| 国产精品黄色影片导航在线观看| 久久99精品久久久久久青青91| 欧美一区二区三区免费视| 911国产网站尤物在线观看| 国产精品电影久久久久电影网| 亚洲香蕉在线观看| 在线视频免费一区二区| 亚洲美女精品久久| 久热国产精品视频| 宅男66日本亚洲欧美视频| 成人精品在线观看| 91精品国产乱码久久久久久久久| 久久精品国产久精国产思思| 国产精品永久免费| 在线成人激情视频| 亚洲天堂开心观看| 欧美精品激情在线| 国产日韩精品视频| 日韩精品视频在线观看免费| 欧美电影免费观看| 国产精品自拍偷拍视频| 亚洲色图17p| 夜夜嗨av一区二区三区免费区| 久久夜色精品亚洲噜噜国产mv| 久久久久久国产精品久久| 狠狠色狠狠色综合日日小说| 久久精品人人做人人爽| 亚洲a级在线观看| 国产在线播放不卡| 亚洲成色999久久网站| 日韩在线观看精品| 久久久久免费精品国产| 欧美日韩电影在线观看| 亚洲男人的天堂在线播放| 91免费福利视频| 亚洲香蕉成视频在线观看| 欧美黑人国产人伦爽爽爽| 国产免费成人av| 国产精品吹潮在线观看| 亚洲精品98久久久久久中文字幕| 欧美精品一区二区免费| 国产精品美腿一区在线看| 欧美日韩亚洲一区二| 亚洲第一福利视频| 色综合男人天堂| 亚洲无限av看| 91精品国产91久久久久久吃药| 国产精品综合网站| 懂色av一区二区三区| 亚洲伦理中文字幕| 九九九久久久久久| 久久久久久久999精品视频| 91精品国产91久久久久久吃药| 亚洲欧美日韩第一区| 在线视频国产日韩| 亚洲一区二区三区sesese| 97久久精品在线| 国产亚洲一区二区精品| 最新国产精品拍自在线播放| 欧美日韩国产色视频| xxav国产精品美女主播| 国产一区二区三区中文| 亚洲精品在线不卡| 精品福利一区二区| 97在线免费观看视频| 国产精品高清免费在线观看| 欧美野外wwwxxx| 久久五月情影视| 国产成人精品一区二区| 日本中文字幕久久看| 国产欧美一区二区三区四区| 狠狠躁夜夜躁久久躁别揉| 久久国产色av| 国产成人精品久久| 亚洲欧美国产一区二区三区| 精品女厕一区二区三区| 福利视频第一区| 黑人精品xxx一区| 91黑丝高跟在线| 疯狂做受xxxx欧美肥白少妇| 国产精品video| 亚洲亚裔videos黑人hd| 欧美日韩亚洲91| 91av在线精品| 亚洲午夜精品久久久久久久久久久久| 国产精品久久久久久久久久ktv| 亚洲第一精品夜夜躁人人躁| 欧美怡红院视频一区二区三区| 97国产suv精品一区二区62| 亚洲精品一区二区在线| 日韩av电影在线免费播放| 国产精品久久久久久av| 国产一区二区三区精品久久久| 国产91精品久久久久久久| 亚洲精品第一页| 国产欧美韩国高清| 欧美精品一区二区免费| 国产三级精品网站| 91干在线观看| 亚洲美女av在线| 久久久亚洲福利精品午夜| 欧美视频一区二区三区…| 国产成人啪精品视频免费网| 午夜精品免费视频| 亚洲精品久久久久久久久久久| 欧美激情啊啊啊| 亚洲精品资源在线| 久久精品99久久久久久久久|