欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Ruby 中的 module_function 和 extend self異同

Ruby 中的 module_function 和 extend self異同

熱門標簽:買了外呼系統不想用了怎么辦 開封百應電銷機器人聯系方式 武漢呼叫中心外呼系統線路商 浦東上海400開頭的電話申請 樂昌電話機器人 真人語音電銷機器人系統 邯鄲外呼調研線路 電話機器人電話卡封號怎么辦 北京語音電銷機器人價格

在閱讀開源的 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.rb
module 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_function
end

MyModule.module_method
MyModule.private_method_to_module_function
begin
 MyModule.public_meth
rescue
 p "public method can not be called by module_name.public_meth"
end
begin
 MyModule.private_method
rescue NoMethodError
 p "private method can not be called by module_name.module_method"
end

class MyClass
 include MyModule
end

obj = MyClass.new
obj.public_meth

begin
 obj.private_method
rescue NoMethodError
 p "private method in module can not be call by object.method_name"
end

begin
 obj.module_method
rescue 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.rb
module 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"
 end
end

class MyClass
 include MyModule
end

MyModule.public_meth

begin
 MyModule.private_method
rescue NoMethodError
 p "private method in extend self module can not be called module_name.private_method"
end

obj = MyClass.new
obj.public_meth

begin
 obj.private_method
rescue 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

您可能感興趣的文章:
  • Ruby中require、load、include、extend的區別介紹

標簽:松原 宜春 鄂州 自貢 石嘴山 淄博 河北 六安

巨人網絡通訊聲明:本文標題《Ruby 中的 module_function 和 extend self異同》,本文關鍵詞  Ruby,中的,module,function,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Ruby 中的 module_function 和 extend self異同》相關的同類信息!
  • 本頁收集關于Ruby 中的 module_function 和 extend self異同的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产在线麻豆精品观看| 妖精视频在线观看免费| 欧洲精品在线观看| 中文字幕一区二区三区不卡在线 | 成人精品电影在线观看| 91l九色lporny| 久久一区二区三区国产精品| 久久精品久久99精品久久| 成人在线综合网站| 免费在线观看黄色小视频| 日本一区二区电影| 国产精品66部| 无码黑人精品一区二区| 国产精品乱码一区二区三区软件 | 亚洲av无码一区二区三区观看| 国产中文av在线| 中文子幕无线码一区tr| 成人精品视频一区二区三区 | 成人性生交大免费看| 日韩欧美国产一区二区三区| 免费人成精品欧美精品| 精品人妻一区二区乱码| 国产免费美女视频| 最新热久久免费视频| 91原创在线视频| 欧美日韩国产色站一区二区三区| 国产精品久久久一本精品| 成人午夜免费视频| 在线观看av一区| 午夜欧美电影在线观看| 精品国产无码在线观看| 久久久久久久久久久久久夜| 国产91露脸合集magnet| 色www精品视频在线观看| 亚洲国产成人av网| 日本xxxxxxxxx18| 国产精品每日更新| 日韩高清一二三区| 日韩免费性生活视频播放| 国产伦精一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品天天摸av网| 99国产欧美久久久精品| 91精品啪在线观看国产60岁| 久久精品国产免费| 小泽玛利亚一区二区免费| 亚洲激情一二三区| 在线 丝袜 欧美 日韩 制服| 日韩亚洲欧美成人一区| 国产在线播精品第三| 色哟哟日韩精品| 日韩av午夜在线观看| 四虎地址8848| 亚洲线精品一区二区三区八戒| 粗大的内捧猛烈进出视频| 欧美videossexotv100| 美腿丝袜亚洲综合| 91九色丨porny丨极品女神| 亚洲高清免费在线| 欧美极品jizzhd欧美18| 一区二区三区日韩精品| 91精产国品一二三| 欧美精品一区二区高清在线观看| 激情五月婷婷综合| 欧美综合久久久| 精品亚洲免费视频| 欧美性大战久久| 亚洲成a人片综合在线| 香蕉久久久久久久| 欧美国产1区2区| jlzzjlzz亚洲日本少妇| 在线视频一区二区三区| 久久99久久精品欧美| 91久久精品国产91性色tv| 久久99精品国产.久久久久久| 丁香花五月婷婷| 亚洲永久免费av| 色婷婷粉嫩av| 青娱乐精品视频| 在线视频国内一区二区| 亚洲福中文字幕伊人影院| 97精品在线播放| 日本不卡一区二区三区| 色撸撸在线视频| 日韩精品高清不卡| 91黄视频在线观看| 国产精品白丝av| 日韩欧美一级二级三级 | 色综合久久综合网欧美综合网| 一区二区三区在线免费视频| 国产伦精品一区二区免费| 精品国产一区二区三区av性色| 国产99久久久精品| 欧美成人精品福利| 欧美熟妇精品一区二区| 中文字幕视频一区| 国产老熟女伦老熟妇露脸| 久久免费偷拍视频| 中文字幕在线永久| 亚洲一区在线看| 色综合久久综合网欧美综合网| 五月天丁香久久| 在线免费不卡视频| 成人午夜激情在线| 国产午夜三级一区二区三| 最好看的中文字幕| 国产精品国产三级国产普通话蜜臀 | 欧美精品在线观看一区二区| 久久成人免费网| 一本色道综合亚洲| 秋霞影院一区二区| 91精品国产综合久久小美女| 国产精品自产自拍| 久久婷婷成人综合色| 一区二区黄色片| 蜜臀av国产精品久久久久| 美女的奶胸大爽爽大片| 国产精华液一区二区三区| 91 com成人网| 特级特黄刘亦菲aaa级| 亚洲在线视频免费观看| 欧美亚洲图片小说| 成人一区二区三区仙踪林| 一区二区三区欧美| 欧美写真视频网站| 成人做爰69片免费| 亚洲国产欧美一区二区三区丁香婷| 一本一本久久a久久| 国产一区二区调教| 国产蜜臀97一区二区三区| 青青青手机在线视频| 国产成人a级片| 国产精品高潮呻吟久久| 色综合天天性综合| 91免费版在线| 亚洲午夜免费视频| 一本久久a久久免费精品不卡| 极品少妇xxxx精品少妇偷拍| 久久亚洲精品国产精品紫薇| 特级西西人体高清大胆| 国产69精品久久久久毛片| 亚洲欧洲av另类| 欧美日韩一区在线| 性囗交免费视频观看| 美日韩黄色大片| 久久精品亚洲精品国产欧美| 日本xxx在线播放| 久久成人麻豆午夜电影| 国产午夜精品一区二区三区四区| 无码人妻aⅴ一区二区三区| 男人的天堂久久精品| wwww国产精品欧美| 手机在线免费看毛片| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美国产精品一区二区| 丰满少妇在线观看资源站| 激情综合色播五月| 中文字幕综合网| 国模无码国产精品视频| 日韩精品xxx| 免费人成黄页网站在线一区二区| 7799精品视频| 女人黄色一级片| 狠狠色丁香婷婷综合久久片| 欧美v亚洲v综合ⅴ国产v| 女人18毛片毛片毛片毛片区二| 国模一区二区三区白浆| 椎名由奈av一区二区三区| 777亚洲妇女| 亚洲精品自拍视频在线观看| 国产精品123| 亚洲一区中文日韩| 久久免费精品国产久精品久久久久| 免费看裸体网站| 97精品视频在线观看自产线路二| 亚洲天堂2014| 欧美一区二区三区视频| 亚洲女同二女同志奶水| 三大队在线观看| 激情成人午夜视频| 亚洲在线成人精品| 欧美精品18+| 中文字幕求饶的少妇| 无码国产精品久久一区免费| 国产综合色视频| 亚洲综合在线免费观看| 久久久久亚洲蜜桃| 亚洲熟女毛茸茸| 手机在线成人av| 美女视频黄 久久| 久久久精品黄色| 欧美日韩一区二区三区四区| 日韩一级片在线免费观看| 91传媒理伦片在线观看| 懂色av中文一区二区三区| 五月综合激情网| 中文字幕亚洲精品在线观看| 欧美精品一区二区三区在线播放 | 性生活一级大片| 蜜桃视频在线观看一区二区|