校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 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異同的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日本韩国一区二区| 国产不卡视频在线播放| 国产精品理伦片| 久久久另类综合| 久久夜色精品一区| 26uuu精品一区二区| 久久久九九九九| 国产欧美日韩三级| 中文字幕中文字幕一区二区| 国产精品嫩草影院com| 亚洲三级在线免费| 一区二区三区视频在线看| 一区二区三区久久| 日产国产欧美视频一区精品| 日韩成人午夜电影| 国产原创一区二区| 成人免费视频视频| 91麻豆精东视频| 欧美人狂配大交3d怪物一区| 91精品在线观看入口| 精品国产1区二区| 日本一区二区三区在线不卡| 亚洲天天做日日做天天谢日日欢| 亚洲人吸女人奶水| 日韩不卡在线观看日韩不卡视频| eeuss影院一区二区三区| 亚洲国产一区视频| 美脚の诱脚舐め脚责91 | 自拍偷拍国产亚洲| 亚洲成av人片一区二区三区| 久久精品国产99国产| www.久久久久久久久| 欧美亚洲国产bt| 欧美精品一区二区三区久久久| 国产午夜精品一区二区| 亚洲一区在线电影| 国产成人精品一区二| 欧美综合色免费| 久久久久久一二三区| 亚洲激情五月婷婷| 国产美女娇喘av呻吟久久| 日本高清不卡aⅴ免费网站| 日韩精品一区二区三区老鸭窝| 中文字幕在线观看不卡| 美国十次综合导航| 欧洲生活片亚洲生活在线观看| 精品国产百合女同互慰| 一区二区成人在线观看| 国产成人免费视频网站| 5566中文字幕一区二区电影| 国产精品初高中害羞小美女文| 天天影视网天天综合色在线播放| 成人伦理片在线| 2023国产精品| 日韩成人午夜精品| 欧美图片一区二区三区| 国产精品网站在线| 国产一区二区三区久久久| 在线不卡中文字幕| 亚洲影院理伦片| 91亚洲午夜精品久久久久久| 国产日韩欧美电影| 紧缚捆绑精品一区二区| 91精品国产福利在线观看| 国产精品福利影院| 国产精品亚洲午夜一区二区三区| 日韩一区二区在线观看视频播放| 亚洲亚洲人成综合网络| 一本久道中文字幕精品亚洲嫩| 欧美激情中文不卡| 成人激情校园春色| 国产丝袜在线精品| 国产成人精品午夜视频免费| 欧美不卡一区二区三区四区| 日本强好片久久久久久aaa| 欧美疯狂做受xxxx富婆| 午夜婷婷国产麻豆精品| 欧美在线制服丝袜| 亚洲综合在线免费观看| 色综合一个色综合| 一区二区三区在线观看欧美 | 亚洲在线视频免费观看| 91福利在线免费观看| 亚洲一线二线三线久久久| 91原创在线视频| 悠悠色在线精品| 欧美亚洲综合另类| 亚洲不卡av一区二区三区| 欧美三级电影网| 视频一区二区三区入口| 精品理论电影在线观看| 国产成人在线免费| 国产精品久久久久婷婷| www.日韩大片| 亚洲午夜激情av| 7777精品伊人久久久大香线蕉完整版 | 亚洲一区二区在线免费观看视频| 欧美在线免费播放| 热久久久久久久| 久久精品一区八戒影视| 色综合久久久网| 亚洲大片免费看| 欧美videofree性高清杂交| 国产精品69毛片高清亚洲| 亚洲欧美在线观看| 欧美精品在线视频| 国内不卡的二区三区中文字幕| 国产精品污www在线观看| 欧美性三三影院| 免费日本视频一区| 国产精品日韩精品欧美在线| 一本一道久久a久久精品综合蜜臀| 午夜精品一区在线观看| 久久精品欧美一区二区三区不卡 | 美女视频免费一区| |精品福利一区二区三区| 欧美一区二区精品在线| 成人av一区二区三区| 五月婷婷综合在线| 国产精品蜜臀av| 日韩精品最新网址| 色欧美日韩亚洲| 国内精品第一页| 亚洲成人综合视频| 国产精品久久久久久久久动漫| 欧美另类久久久品| 99久久精品免费看国产| 久久草av在线| 亚洲一区二区视频在线观看| 26uuu欧美| 欧美一级黄色大片| 日本精品免费观看高清观看| 国产成人av福利| 男人操女人的视频在线观看欧美| 国产精品三级av在线播放| 精品欧美一区二区三区精品久久 | 另类小说视频一区二区| 亚洲一区二三区| 亚洲欧美一区二区三区久本道91| 精品国产第一区二区三区观看体验| 欧美日韩国产天堂| 色综合久久中文字幕| 成人午夜大片免费观看| 精品在线一区二区| 日本欧美一区二区在线观看| 亚洲一区国产视频| 亚洲嫩草精品久久| 国产精品久久久久一区二区三区共| 久久人人97超碰com| 日韩视频免费观看高清在线视频| 欧美婷婷六月丁香综合色| 在线观看视频91| 91小视频在线| 91网站在线播放| 99国内精品久久| 99国产精品久久久久久久久久| 国产不卡视频在线观看| 国产98色在线|日韩| 大尺度一区二区| 成人免费看的视频| 成人三级在线视频| 国产91色综合久久免费分享| 国产精品亚洲人在线观看| 狠狠色丁香九九婷婷综合五月| 精品一区二区三区久久| 久久99久久99精品免视看婷婷 | 亚洲精品高清在线| 一区二区三区在线视频免费| 亚洲电影一区二区| 免费在线看一区| 国产麻豆成人精品| 成人国产精品免费| caoporen国产精品视频| 91麻豆123| 欧美一卡2卡三卡4卡5免费| 日韩欧美三级在线| 国产香蕉久久精品综合网| 亚洲欧洲成人精品av97| 亚洲欧美成人一区二区三区| 天天影视涩香欲综合网| 国产自产v一区二区三区c| 成人深夜福利app| 欧美日韩一区二区三区不卡| 日韩一区二区在线看| 欧美国产日韩精品免费观看| 亚洲国产综合91精品麻豆| 九九九久久久精品| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美视频在线一区| 久久久久久久久久久电影| 亚洲综合丝袜美腿| 激情综合色综合久久综合| 99久久婷婷国产| 欧美一区二区三区四区视频| 久久精品这里都是精品| 亚洲国产日韩在线一区模特| 国产一区999| 欧美精品丝袜久久久中文字幕| 久久久99精品久久| 亚洲国产一区视频|