最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ruby元編程基礎學習筆記整理

 更新時間:2016年07月02日 16:57:49   作者:lucifercn  
元編程Metaprogramming是指編寫能夠操作其他程序的程序,例如C語言中的宏,是編程中的一項高級技巧,這里我們立足基礎,來看一下Ruby元編程基礎學習筆記整理.

筆記一:
代碼中包含變量,類和方法,統(tǒng)稱為語言構建(language construct)。

# test.rb
class Greeting
 def initialize(text)
  @text = text
 end

 def welcome
  @text
 end
end
my_obj = Greeting.new("hello")
puts my_obj.class
puts my_obj.class.instance_methods(false) #false means not inherited
puts my_obj.instance_variables

result =>
Greeting
welcome
@text

總結:
實例方法繼承于類,實例變量存在于對象本身。
類和對象都是ruby中的第一類值。

應用示例:

mongo API for ruby => Mongo::MongoClient

# testmongo.rb
require 'mongo'
require 'pp'

include Mongo

# the members of replcation-set
# test mongodb server version 2.6.0
host = "192.168.11.51"
# The port of members
# If the port is 27017 by default then otherport don't need to assignment
otherport = ""
port = otherport.length != 0 ? otherport : MongoClient::DEFAULT_PORT

opts = {:pool_size => 5, :pool_timeout => 10}
# Create a new connection
client = MongoClient.new(host, port, opts)

# puts client.class
puts client.class.constants
puts client.instance_variables
puts client.class.instance_methods(false)


分別輸出

Constant, Instance Attribute, Instance Method

筆記二:動態(tài)調用
當你調用一個方法時,實際是給一個對象發(fā)送了一條消息。

class MyClass
 def my_method(args)
  args * 10
 end
end
obj = MyClass.new

puts obj.my_method(5)
puts "**"
puts obj.send(:my_method, 6)

結果:

50
**
60

可以使用object#send()取代點標記符來調用MyClass#my_method()方法:

obj.send(:my_method, 6)

send()方法第一個參數是要發(fā)送給對象的消息,可以是符號(:symbol)或字符串,其他參數會直接傳遞給調用的方法。
可以動態(tài)的決定調用哪個方法的技術,成為Dynamic Dispatch。

筆記三:符號和字符串的區(qū)別
1. 符號不可變,可以修改字符串中的字符。
2. 針對符號的操作更快些。
3. 通常符號用來表示事物的名字。
例如:

puts 1.send(:+, 4) => 5
String#to_sym(),String#intern() => string to symbol
String#to_s(),String#id2name() => symbol to string
"caoqing".to_sym() => :caoqing
:caoqing.to_s() => "caoqing"

動態(tài)派發(fā)中使用模式派發(fā)(pattern dispatch)的方法。

puts obj.class.instance_methods(true).delete_if{ |method_name| method_name !~ /^my/}
result => 
my_method

筆記四:動態(tài)定義
使用Module#define_method()方法定義一個方法。

class MyClass
 define_method :my_method do |args|
  args * 3
 end
end
obj = MyClass.new
puts obj.my_method(10)

結果:30

單件方法允許給單個對象增加一個方法。singleton methods

# test.rb
str = "My name is caoqing."
def str.title?
 self.upcase == self
end

puts str.title?
puts str.methods.grep(/^title?/)
puts str.singleton_methods

結果:

false
title?
title?

筆記五:
類方法的本質,類是對象,類名是常量。在類上調用方法和對象調用方法一樣:

obj.my_method
Cla.class_method

Duck Typing:對象能不能響應方法,可以是普通方法或者單件方法。
類方法的實質就是他們是類的一個單件方法。

def obj.method
 # method body
end

obj可以是對象引用,常量類名或self。

類宏(Class Macro)
Ruby對象沒有屬性,可以使用擬態(tài)方法定義屬性。
Module#attr_*()方法中的一員來定義訪問器。類宏不是關鍵字而是方法。

Eigenclass
單件方法按照常規(guī)的方法查找在祖先鏈無法找到保存的地方,obj是對象不能保存,也不能存在于class內,否則所有的實例都可以共享這個方法。
對象擁有一個特有的隱藏類,稱為該對象的eigenclass。
進入eigenclass作用域:

class << obj
 code
end

如果想獲取eigenclass的引用,則可以在離開該作用域時返回self:

附錄:
類變量,實例變量,類方法,實例方法區(qū)別
@@                            :var類變量
@                            :實例變量
self(?clas,::).method        :類方法
method                        :實例方法

# test.rb
class Foo
 @@var = "lion"
 def self.method01
  puts "cat"
  @name = "cat"
  @@var = "cat"
  puts @name
 end

 def self.method02
  puts "tiger"
  @name = "tiger"
  @@var = "tiger"
  puts @name
 end

 def self.method03
  puts "dog"
  @name = "dog"
  @@var = "dog"
  puts @name
 end

 def putsname
  puts @name
  puts @@var
 end
end

obj = Foo.new
# obj.method01   => (NoMethodError)

obj.putsname   => lion

Foo.method01
Foo.method02
Foo.method03
obj.putsname

結果:

lion
cat
cat
tiger
tiger
dog
dog

dog

相關文章

  • Python中的pprint模塊

    Python中的pprint模塊

    本文介紹了 Python中的pprint模塊,pprint模塊包含一個“美觀打印機”,用于生成數據結構的一個美觀的視圖。格式化工具會生成數據結構的一些表示,不僅能夠由解釋器正確地解析,還便于人閱讀。輸出會盡可能放在一行上,分解為多行時會縮進,想了解具體內容請參考下文
    2021-11-11
  • Python操作MySQL數據庫的入門指南

    Python操作MySQL數據庫的入門指南

    MySQL是一種關系型數據庫管理系統(tǒng),廣泛應用于各種應用程序和網站,在本篇技術博客中,我們將探討如何使用Python操作MySQL數據庫,需要的可以收藏一下
    2023-06-06
  • Python編程實現微信企業(yè)號文本消息推送功能示例

    Python編程實現微信企業(yè)號文本消息推送功能示例

    這篇文章主要介紹了Python編程實現微信企業(yè)號文本消息推送功能,結合實例形式分析了Python微信企業(yè)號文本消息推送接口的調用相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • Python新手入門最容易犯的錯誤總結

    Python新手入門最容易犯的錯誤總結

    這篇文章主要總結了一些關于Python新手入門最容易犯的錯誤,希望通過學習本文總結的十二點易犯錯誤點,能夠給新手們帶來一定的幫助,需要的朋友可以參考學習,下面來一起看看吧。
    2017-04-04
  • 理想高通濾波實現Python opencv示例

    理想高通濾波實現Python opencv示例

    今天小編就為大家分享一篇關于理想高通濾波實現Python opencv示例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python urllib3軟件包的使用說明

    Python urllib3軟件包的使用說明

    這篇文章主要介紹了Python urllib3軟件包的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • python 異常的傳遞性及主動拋出學習

    python 異常的傳遞性及主動拋出學習

    這篇文章主要為大家介紹了python 異常的傳遞性及主動拋出學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 何用Python實現一個 “系統(tǒng)聲音” 的實時律動掛件

    何用Python實現一個 “系統(tǒng)聲音” 的實時律動掛件

    這篇文章將給大家介紹了如何用 Python 實現一個 “系統(tǒng)聲音” 的實時律動掛件,采集后直接實時地在電腦上繪制波形動畫,主要是用來作為 FL Studio 播放時的一個桌面小掛件,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-01-01
  • python二叉樹的實現實例

    python二叉樹的實現實例

    這篇文章主要介紹了python二叉樹的實現實例,大家參考使用吧
    2013-11-11
  • django中related_name的用法說明

    django中related_name的用法說明

    這篇文章主要介紹了django中related_name的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論

松滋市| 襄垣县| 噶尔县| 江山市| 博湖县| 澳门| 康马县| 娄烦县| 敦化市| 晴隆县| 宕昌县| 道真| 泸溪县| 铜山县| 治县。| 巨鹿县| 株洲市| 陇南市| 信丰县| 合肥市| 大悟县| 延川县| 宜城市| 建水县| 合山市| 泌阳县| 丰顺县| 水富县| 夏津县| 玛多县| 汝州市| 清远市| 白城市| 永丰县| 徐闻县| 磐安县| 吕梁市| 湘潭市| 孝义市| 青铜峡市| 乾安县|