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

首頁 > 編程 > Ruby > 正文

Ruby 中的 module_function 和 extend self異同

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

在閱讀開源的 Ruby 代碼和編寫可維護性的代碼經常遇到這兩者的使用,那么他們兩者的共同點和區別是什么呢?

module_function

Ruby 的 module 是 method 和 constants 的集合。module 中的method 又可分為 instance method 和 module method, 當一個 module 被 include 進一個 class ,那么 module 中的 method (注:沒有被 module_function 標記的 method)就是 class 中的 instance method, instance method 需要所在的 class 被實例化之后才能被調用;被 module_function 標記的 method(不管該 method 是 public 或者 private)就是 module method 且 instance method 也會變成 private method,對于被 include 所在的 class 來說是 private method,object.module_name 會出錯。module method 都能被 module_name.method_name 調用,沒有被 module_function 標記的 public method 不能被 module_name.method_name 調用。

module 中的 module_function 會把 module 中的 method 變成 module method 且對于被 include 所在的 class 來說,module method 在 module 中是 private method 故 module_name.module_method 能調用,而不能被 object.module_name 調用。

module 中的 public method 對于被 include 所在的 class 來說是 instance method,故 object.public_method_in_module 能調用。如果想要非 module method 能夠被 module 調用(module_name.not_module_method) ,需要引入 extend self (下文會討論 extend self)

# test.rbmodule MyModule def public_meth  p "a public method, if the module is included to a class , can be call as object.public_meth" end def module_method  p "a module method,can be called as module_name.module_method. but can not be call as object.module_method" end private def private_method_to_module_function  p "a private_method, but can be call as module_name.module_method, because it was assigned to module_function" end def private_method  p "I am a private method" end module_function :module_method, :private_method_to_module_functionendMyModule.module_methodMyModule.private_method_to_module_functionbegin MyModule.public_methrescue p "public method can not be called by module_name.public_meth"endbegin MyModule.private_methodrescue NoMethodError p "private method can not be called by module_name.module_method"endclass MyClass include MyModuleendobj = MyClass.newobj.public_methbegin obj.private_methodrescue NoMethodError p "private method in module can not be call by object.method_name"endbegin obj.module_methodrescue NoMethodError p "module method can not be called by object.method_name, for object, module method is private instance method"end#調用ruby test.rb"a module method,can be called as module_name.module_method. but can not be call as object.module_method""a private_method, but can be call as module_name.module_method, because it was assigned to module_function""public method can not be called by module_name.public_meth""private method can not be called by module_name.module_method""a public method, if the module is included to a class , can be call as object.public_meth""private method in module can not be call by object.method_name""module method can not be called by object.method_name, for object, module method is private instance method"

總結就是

•The method will be copied to class' singleton class
•The instance method's visibility will become private

extend self

Include is for adding methods to an instance of a class and extend is for adding class methods

extend 本質是給 class 或者 module 添加 class method

extend self 讓 module 中的 instance method 能夠被 module_name.instance_method 調用,保留 module 中原本 method 的 public 或 private 屬性,但又不像 module_function 一樣把被標記的 method 變成 private 。

#!/usr/bin/env ruby# encoding: utf-8# test_extend.rbmodule MyModule extend self def public_meth  p "a public_method extended by self can be called by module_name.public_meth and object.public_meth, included by a class"  private_method end private def private_method  p "a private method, can be call in module internal" endendclass MyClass include MyModuleendMyModule.public_methbegin MyModule.private_methodrescue NoMethodError p "private method in extend self module can not be called module_name.private_method"endobj = MyClass.newobj.public_methbegin obj.private_methodrescue NoMethodError p "private method can not be called by object.private_method"end# 調用 ruby test_extend.rb"a public_method extended by self can be called by module_name.public_meth and object.public_meth, included by a class""a private method, can be call in module internal""private method in extend self module can not be called module_name.private_method""a public_method extended by self can be called by module_name.public_meth and object.public_meth, included by a class""a private method, can be call in module internal""private method can not be called by object.private_method"

總結就是:
•No method copying involved
•No changes to method visibility

總結

module_function 改變 module 內 原來 method 的 public/private 屬性并把改 method 變成 module method ,能夠被 module_name.module_method 調用。

extend self 就是在 module 自繼承,不改變 module 中 method 的 public/private 屬性,能夠被 module_name.public_method

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产视频一二三区| 日韩精品免费一区二区| 国产专区在线| 久草国产视频| 福利视频在线看| 尤物网站在线| 在线观看的网站你懂的| 久热免费在线视频| √天堂中文在线| 一级二级三级在线观看| 影音av资源站| 天堂资源在线中文| 在线色视频观看| 国自产拍在线网站网址视频| 国产黄色免费网站| 欧美日韩在线精品成人综合网| 日本中文字幕视频在线| 亚洲综合色视频在线观看| eeuss在线观看| 国产免费视频| www.大网伊人| 在线国产一级| 国产黄色片大全| 黄网在线免费| 亚洲天堂视频在线观看免费| 国产精品偷乱一区二区三区| sese在线视频| 亚洲社区在线| 精品国产福利一区二区在线| 九九精品九九| 久久精品国产亚洲a∨麻豆| 在线观看免费观看在线91| 天堂在线视频| 国产免费网址| 欧美亚洲天堂| 日本在线视频www鲁啊鲁| 国产一二三区在线观看| 日本高清中文字幕二区在线| 精品视频一二三| 91在线看片| 国产成人久久精品77777| 国产偷激情在线| 中文字幕在线观看av| 国产女王在线**视频| 国产网红在线| 国产午夜在线视频| 国产精品国产三级国产试看| 国产激情视频网址| 国产对白在线| 国产xxx在线| 亚洲精品在线视频免费| av在线1区2区| 男人天堂v视频| 高清av中文在线字幕观看1| 欧美日韩综合高清一区二区| 欧美日韩一区二区三区视视频| 青青草视频在线免费观看| av资源网站在线观看| 青青九九免费视频在线| 成年女人在线视频| 2018av男人天堂| 2020中文字幕在线播放| av网站大全在线观看| 欧美96在线| 久久久久久久久免费视频| 久草视频国产| 92久久精品| 玖玖在线视频| 国产网站麻豆精品视频| 91在线视频免费看| wwwww亚洲| 国产私人尤物无码不卡| www狠狠操| 综合图区亚洲白拍在线| 国产xxx在线| 国产在线观看av| 精品女厕厕露p撒尿| 黄色在线视频观看网站| 91福利在线视频| 欧美性猛交p30| 国产成免费视频| 国产永久在线观看| 在线观看av中文| 国产视频福利在线| 九九99九九精彩| www在线视频| 在线视频中文字幕第一页| 黄色免费av| 免费网站看黄yyy222| 精品国产一区二区三区久久久狼牙| 免费看av大片| www.av在线| 在线观看视频污| 91xx在线观看| 国产美女免费观看| 久热中文字幕精品视频在线| 亚洲日本一区二区三区在线观看| 国产精品久久久高清免费| 国产免费麻豆视频| 国产在线超碰| 中文字幕在线永久在线视频| 国产永久av在线| 午夜免费福利在线观看| 尤物网在线观看| 国产小视频在线高清播放| 中文字幕在线免费看| 国产一二区在线| 国产大学生粉嫩无套流白浆| 国产aa视频| 国产精品久久久久久精| 国产三级在线观看| 伊人精品影院| 免费视频二区| 国产一级电影网| 18成年在线观看| 日本福利午夜视频在线| 非洲黑人最猛性xxxx交| 中文字幕在线视频免费观看| 国产精品视频一区二区久久 | www.操.com| 久久久久久五月天久久久久久久久| 久久国产综合视频| 国产精品白浆流出视频| 国产啊啊啊视频在线观看| 伊人福利在线| 国产理论在线观看| 国产福利视频在线观看| 日本不卡1区2区3区| 国产专区在线| 在线视频1区2区| 天天av天天爱| 青青草免费在线视频| 国产原创av在线| 亚洲人av在线| 国产亚洲精品拍拍拍拍拍| 尤物在线精品视频| 国产剧情在线一区| 亚洲第一区视频| 天堂在线免费观看| 四虎精品成人a在线观看| 91超碰国产在线| 亚洲v片在线观看| 国产激情在线观看| 国产毛片毛片| www.三级.com| 亚洲永久免费网站| 国产精品久久久精品a级小说| 日本福利午夜视频在线| 99中文字幕一区| 国产二区三区在线| 国产精品视频一区麻豆| 免费黄网站在线观看| 精品国产一区二区三区不卡在线| 激情丁香在线| 久久综合精品视频| 欧美日韩亚洲第一页| a级在线观看| 日本久久网站| 免费在线黄色网址| 青草在线视频在线观看| 性网站在线播放| 日本欧洲一区| 免费黄网站在线观看| 亚洲videos| 本道综合精品| 欧美韩日国产| 超碰在线中文| 午夜不卡视频| 国产视频中文字幕| 999精品网| a视频在线观看免费| 毛片在线视频| 中文字幕国产在线| 国产精品久久久高清免费| 91午夜视频| jlzzjlzz欧美大全| 九九热在线视频免费观看| 国产中文在线视频| 国产羞羞视频在线播放| 精品街拍一区二区| gogo在线观看| 日本中文字幕在线看| 国产成人va亚洲电影| 精品女厕厕露p撒尿| 青青草免费观看免费视频在线| 国产尤物视频在线| 国产夫妻视频| 激情五月色综合亚洲小说| 国产偷倩在线播放| 日本aⅴ写真网站免费| 五月婷婷开心综合| 在线国产中文字幕| 日本中文字幕在线视频| 91xx在线观看| 91超碰国产在线| 日本不卡1区2区3区| 国产www网站| 最近中文字幕mv免费高清在线| 992tv在线观看在线播放| 日本福利午夜视频在线|