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

Ruby元編程基礎(chǔ)學(xué)習(xí)筆記整理

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

筆記一:
代碼中包含變量,類和方法,統(tǒng)稱為語言構(gòu)建(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

總結(jié):
實(shí)例方法繼承于類,實(shí)例變量存在于對(duì)象本身。
類和對(duì)象都是ruby中的第一類值。

應(yīng)用示例:

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

筆記二:動(dòng)態(tài)調(diào)用
當(dāng)你調(diào)用一個(gè)方法時(shí),實(shí)際是給一個(gè)對(duì)象發(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)

結(jié)果:

50
**
60

可以使用object#send()取代點(diǎn)標(biāo)記符來調(diào)用MyClass#my_method()方法:

obj.send(:my_method, 6)

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

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

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"

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

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

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

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

結(jié)果:30

單件方法允許給單個(gè)對(duì)象增加一個(gè)方法。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

結(jié)果:

false
title?
title?

筆記五:
類方法的本質(zhì),類是對(duì)象,類名是常量。在類上調(diào)用方法和對(duì)象調(diào)用方法一樣:

obj.my_method
Cla.class_method

Duck Typing:對(duì)象能不能響應(yīng)方法,可以是普通方法或者單件方法。
類方法的實(shí)質(zhì)就是他們是類的一個(gè)單件方法。

def obj.method
 # method body
end

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

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

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

class << obj
 code
end

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

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

# 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

結(jié)果:

lion
cat
cat
tiger
tiger
dog
dog

dog

相關(guān)文章

  • Python中的pprint模塊

    Python中的pprint模塊

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

    Python操作MySQL數(shù)據(jù)庫的入門指南

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

    Python編程實(shí)現(xiàn)微信企業(yè)號(hào)文本消息推送功能示例

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

    Python新手入門最容易犯的錯(cuò)誤總結(jié)

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

    理想高通濾波實(shí)現(xiàn)Python opencv示例

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

    Python urllib3軟件包的使用說明

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

    python 異常的傳遞性及主動(dòng)拋出學(xué)習(xí)

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

    何用Python實(shí)現(xiàn)一個(gè) “系統(tǒng)聲音” 的實(shí)時(shí)律動(dòng)掛件

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

    python二叉樹的實(shí)現(xiàn)實(shí)例

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

    django中related_name的用法說明

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

最新評(píng)論

普兰县| 辽中县| 新巴尔虎左旗| 宜都市| 江安县| 武山县| 临泽县| 林西县| 英超| 无极县| 浦东新区| 定州市| 庆阳市| 古蔺县| 攀枝花市| 巨野县| 宜丰县| 肥西县| 汽车| 南江县| 贺州市| 德化县| 沙坪坝区| 竹溪县| 尼勒克县| 大竹县| 枣强县| 醴陵市| 泸溪县| 康保县| 霞浦县| 定边县| 利川市| 高雄市| 乐安县| 郴州市| 六盘水市| 宣城市| 泾川县| 临城县| 双城市|