婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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異同的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本亚洲视频在线| 免费成人性网站| 亚洲国产一区二区视频| 久久精品国内一区二区三区| 久久99精品久久久久久国产越南| 色综合久久中文综合久久牛| 精品伦理精品一区| 亚洲国产一二三| av电影一区二区| 精品精品国产高清一毛片一天堂| 亚洲线精品一区二区三区八戒| 高清不卡在线观看av| 欧美一区二区三区四区视频| 尤物av一区二区| www.欧美.com| 中文字幕精品一区二区三区精品| 日本午夜精品一区二区三区电影| 色综合久久66| 中文字幕av免费专区久久| 国内精品在线播放| 日韩午夜精品视频| 蜜桃av噜噜一区| 这里只有精品免费| 亚洲国产成人91porn| 色婷婷一区二区| 国产精品高清亚洲| 91视频xxxx| 亚洲欧洲另类国产综合| 波多野结衣中文字幕一区二区三区| www国产亚洲精品久久麻豆| 日本色综合中文字幕| 欧美一区二区三区四区视频| 午夜视频久久久久久| 欧美做爰猛烈大尺度电影无法无天| 国产亚洲成av人在线观看导航 | 99re成人在线| 亚洲欧洲另类国产综合| 色综合 综合色| 亚洲一区二区三区小说| 欧美在线观看一区| 亚洲第一二三四区| 欧美一区三区二区| 免费人成网站在线观看欧美高清| 欧美日本乱大交xxxxx| 丝袜美腿亚洲色图| 欧美mv日韩mv亚洲| 国产成人一区在线| 亚洲人成亚洲人成在线观看图片 | 日韩精品一区二区三区视频播放 | 国产成人午夜精品5599| 国产精品理伦片| 日本高清无吗v一区| 午夜精品福利一区二区三区蜜桃| 欧美一区二区视频在线观看2022| 国产精品一区二区久久不卡| **性色生活片久久毛片| 欧美日韩免费高清一区色橹橹| 男男gaygay亚洲| 中文字幕一区二区三区四区| 欧美日韩国产免费一区二区 | 欧美日韩国产综合一区二区 | 免费观看日韩av| 欧美国产激情一区二区三区蜜月| 日本高清无吗v一区| 国产一区二区毛片| 亚洲啪啪综合av一区二区三区| 欧美日韩色综合| 国产老女人精品毛片久久| 日韩毛片视频在线看| 在线看不卡av| 高清shemale亚洲人妖| 一区二区三区中文字幕精品精品| 欧美日韩精品免费| 国产精品一区二区果冻传媒| 欧美国产日韩亚洲一区| 色综合色狠狠综合色| 日本中文字幕一区二区视频| 日韩一区二区三区精品视频| 高清久久久久久| 首页综合国产亚洲丝袜| 国产精品美女久久久久久久网站| 日韩一区和二区| 色吊一区二区三区| 国产mv日韩mv欧美| 视频精品一区二区| 亚洲裸体xxx| 欧美国产激情一区二区三区蜜月| 欧美变态口味重另类| 欧美日韩国产美| 91麻豆成人久久精品二区三区| 免费人成在线不卡| 亚洲成在人线免费| 国产精品传媒入口麻豆| 欧美一二三四区在线| 色美美综合视频| 国产一区二区三区四区五区入口| 一区二区三区不卡在线观看| 国产精品美女久久久久av爽李琼| 欧美一区二区大片| 在线观看视频欧美| 粉嫩aⅴ一区二区三区四区五区| 天天综合日日夜夜精品| 综合久久久久久| 国产精品美女久久福利网站| 日韩精品一区二区三区在线| 在线观看亚洲一区| 波多野结衣中文字幕一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲激情图片一区| 久久久综合视频| 国产亚洲欧美色| 欧美一区二区三区小说| kk眼镜猥琐国模调教系列一区二区| 午夜精品久久久久久久久久久| 精品三级在线观看| 久久综合五月天婷婷伊人| 欧美日韩一区二区三区高清| 色菇凉天天综合网| 色综合久久综合| 色综合久久88色综合天天6| 免播放器亚洲一区| 紧缚奴在线一区二区三区| 日本不卡一二三| 三级不卡在线观看| 五月天久久比比资源色| 一区二区国产视频| 国产精品激情偷乱一区二区∴| 国产精品久久久久永久免费观看| 久久久精品天堂| 久久久亚洲高清| 国产清纯在线一区二区www| 国产欧美日韩不卡| 中文字幕精品一区二区三区精品| 亚洲老司机在线| 一区二区久久久| 三级久久三级久久| 精品一区二区三区在线播放 | 国产午夜精品美女毛片视频| 精品国产一区二区三区久久久蜜月| 日韩免费电影一区| 日韩午夜三级在线| 久久久一区二区三区捆绑**| 中文字幕av一区二区三区高| 亚洲色图在线视频| 亚洲国产精品久久一线不卡| 亚洲激情五月婷婷| 精品制服美女丁香| 成人丝袜视频网| 一本久道中文字幕精品亚洲嫩| 色天使色偷偷av一区二区| 精品婷婷伊人一区三区三| 欧美日韩国产欧美日美国产精品| 久久这里只有精品首页| 国产欧美精品一区二区三区四区| 亚洲人123区| 青青草成人在线观看| 国产黄色成人av| 激情文学综合丁香| 欧美日本在线看| 久久免费电影网| 亚洲一区二区黄色| 国产一区二区精品久久91| 国产成人精品免费网站| 7878成人国产在线观看| 国产清纯美女被跳蛋高潮一区二区久久w | 99久久精品国产网站| 欧美日本一道本在线视频| 久久婷婷色综合| 亚洲国产精品一区二区尤物区| 精品一区二区成人精品| 99在线热播精品免费| 欧美精品一二三四| 中文字幕巨乱亚洲| 免费看黄色91| 在线观看av一区二区| 在线成人免费视频| 亚洲在线观看免费| 成人涩涩免费视频| 欧美一区二区三区免费| 亚洲欧美视频在线观看视频| 性久久久久久久久久久久| 色婷婷久久99综合精品jk白丝| ww久久中文字幕| 麻豆精品在线视频| 欧洲一区二区三区免费视频| 欧美一区二区三区视频免费 | 精品国产一区二区三区久久影院 | 理论片日本一区| 在线观看成人小视频| 国产精品女主播在线观看| 久久99久久99小草精品免视看| 欧美一区二区三区免费大片| 亚洲一区在线观看免费观看电影高清| 大胆亚洲人体视频| 久久色.com| 国产美女主播视频一区| 国产日本亚洲高清| 国产精品91一区二区| 精品国产乱码久久久久久图片 | 国产精品美女久久久久aⅴ|