国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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的類宏,通過它你可以對屬性進行你想要的校驗。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产美女高潮一区二区三区| а√资源新版在线天堂| h网址在线观看| 国产理论电影在线| 国产精品㊣新片速递bt| 国产小视频在线播放| 国产福利视频在线| 青青青手机在线视频观看| 老司机精品视频一区二区| 日本中文字幕视频在线| 国产三级视频在线| 操操操综合网| 国产国产人免费人成免费视频| 成人午夜无人区一区二区| 国产欧美黑人| 九九视频九九热| 91极品在线| 狠狠干天天爱| 国产人成高清视频观看| 欧美色第一页| 亚洲视频手机在线观看| 国产网友自拍电影在线| 蜜桃视频中文字幕| 在线视频二区| 国产欧美日韩第一页| 免费av在线| 一本免费视频| 国产黄色免费看| 成人精品福利| 男人天堂亚洲| 免费a级毛片在线播放| 国产精品久久人| 天堂在线免费av| av天天在线| 91极品在线| 国产aa视频| 国产精选在线观看| 国产免费永久在线观看| a级片国产精品自在拍在线播放| 国产视频福利| 国产福利资源| 国产成人精品18| 国产日韩欧美第一页 | av在线免费播放网站| 中文字幕av免费| 在线黄色.com| 在线免费观看黄色av| 91涩漫在线观看c| 91中文在线| 99高清免费国产自产拍| 91麻豆福利| 午夜在线观看91| eeuss影影院www在线播放| www黄在线观看| 国产九九在线| 97在线超碰| 久热精品视频在线播放| 国产在线观看av| 综合激情丁香| 亚洲sss视频| 成在在线免费视频| 国产精品视频h| 国产porny蝌蚪视频| 午夜亚洲成人| 五月婷婷开心综合| 中文岛国精品亚洲一区| 久久精品最新免费国产成人| 国产卡二和卡三的视频| 精品黄色免费中文电影在线播放| 在线国产一级| 国产一区在线视频观看| 69免费视频| 久久久久久久美女| 伊人资源视频在线| 国产黄在线播放| 高清av在线| 在线免费观看黄色片| eeuss在线观看| 国产高清免费av在线| 高清av中文在线字幕观看1| 中文一区在线观看| 国产农村av| 波多野结衣久久高清免费| 国产福利视频在线观看| 最近中文av字幕在线中文| 在线免费看黄av| 91美女主播在线视频| 国产美女福利在线观看| 亚洲综合在线不卡| 国产激情视频一区二区| 国产乱在线观看视频| av在线天堂| 国产视频三区| 五月婷婷开心综合| 九九热在线播放| 亚洲精品乱码电影在线观看| 国产精品久久久久久福利| 天天操天天射天天色| 老司机精品视频一区二区| 日本一卡二卡四卡精品| 亚洲电影先锋| eeuss影院在线观看| 香蕉视频在线看| а√资源新版在线天堂| wwwww在线观看免费视频| av中文字幕在线看| sese一区| www.九九热.com| 久久国产综合视频| 成人免费一区二区三区牛牛| 国产麻豆综合视频在线观看| 成人精品福利| 国产一级黄色大片| 国产夫妻视频| 在线免费观看黄色片| www免费在线观看视频| 黄色一级视频网站| 国产亚洲精品久久久网站好莱| 国产丝袜在线播放| 夜夜爽夜夜操| 99热在线免费观看| 国产福利视频在线| 精品一区二区三区免费站| 亚洲欧美自拍另类| 免费a级毛片在线观看| 国产一级片麻豆| 日本在线天堂| 国产精品视频一区二区久久| 亚洲一道本在线| 黄网址在线播放免费| √8天堂资源地址中文在线| 不卡av免费观看| 精品一区二区三区免费站| 狠狠干婷婷色| 天天插天天色| 国产99re66在线视频| 国产在线高清| 2020国产在线视频| 91av资源在线| 免费的黄网站在线观看| 在线看黄网址| 国产精品666| 中文字幕中文字幕在线中高清免费版 | 精品国产99久久久久久| 国产视频1区| 亚洲91av| 在线中文字幕av| 国产激情在线视频| 国产色a在线| 国产香蕉视频在线看| 国产字幕在线看| 免费黄色网页在线观看| av高清资源| 午夜影院免费| 欧美日韩在线精品成人综合网| 亚洲成人福利| 日本天堂影院在线视频| www在线播放| 羞羞视频在线观看免费| av手机免费观看| 在线播放黄色网址| 日本片在线看| 九九热在线视频免费观看| 国产中文第一页| 国产另类图片| 国产porn在线| 香蕉视频在线看| 狠狠操视频网| 国产一二三区精品视频| 国产啊啊啊视频在线观看| 中文字幕4区| 青草青在线视频| 国产美女被遭强高潮免费网站| 欧美艹逼视频| 中文字幕日本在线观看| 国产精品白浆流出视频| 伊人网站在线| 国产免费一级片| 国产二区视频| 久久久久久久久免费视频| 五月天天在线| 亚洲最新永久在线观看| 免费a级人成a大片在线观看| 国产乱子视频| 在线中文字幕观看| 超碰国产在线观看| 国产黄色一级片| 激情亚洲综合网| 国产精品入口麻豆免费看| 在线播放av网站| 国产一区二区在线|播放| 在线免费日韩| 国产三级在线| 欧美高清视频| 在线播放国产区| 国产激情小视频在线| 玖玖在线视频| eeuss影院网站免费观看| 国产成人综合亚洲欧美在| 狠狠干在线视频|