欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法詳解

    python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法詳解

    這篇文章主要介紹了python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python協(xié)程的原理及使用Gevent實(shí)現(xiàn)協(xié)程操作的相關(guān)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • python安裝sklearn模塊的方法詳解

    python安裝sklearn模塊的方法詳解

    這篇文章主要介紹了python安裝sklearn模塊的方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python面向?qū)ο箢惱^承和組合實(shí)例分析

    Python面向?qū)ο箢惱^承和組合實(shí)例分析

    這篇文章主要介紹了Python面向?qū)ο箢惱^承和組合,結(jié)合實(shí)例形式分析了Python3面向?qū)ο罄^承的原理、用法以及繼承與組合相關(guān)使用技巧,需要的朋友可以參考下
    2018-05-05
  • Python寫一個(gè)簡單的在線編輯器

    Python寫一個(gè)簡單的在線編輯器

    這篇文章主要介紹了如何利用Python寫一個(gè)簡單的在線編輯器,主要通過pywebio程序,實(shí)現(xiàn)了Python的簡陋在線編輯器,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-02-02
  • python基礎(chǔ)教程之Hello World!

    python基礎(chǔ)教程之Hello World!

    這篇文章主要介紹了python基礎(chǔ)教程之Hello World!,本文講解了命令行中、文件中、腳本文件中輸出Hello World的例子,需要的朋友可以參考下
    2014-08-08
  • 簡單介紹Python中的JSON使用

    簡單介紹Python中的JSON使用

    這篇文章主要介紹了Python中的JSON使用,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • django 獲取字段最大值,最新的記錄操作

    django 獲取字段最大值,最新的記錄操作

    這篇文章主要介紹了django 獲取字段最大值,最新的記錄操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Python入門教程(四十三)Python的NumPy數(shù)據(jù)類型

    Python入門教程(四十三)Python的NumPy數(shù)據(jù)類型

    這篇文章主要介紹了Python入門教程(四十二)Python的NumPy數(shù)組裁切,NumPy有一些額外的數(shù)據(jù)類型,并通過一個(gè)字符引用數(shù)據(jù)類型,例如 i 代表整數(shù),u 代表無符號(hào)整數(shù)等,需要的朋友可以參考下
    2023-05-05
  • Flask利用自定義接口實(shí)現(xiàn)mock應(yīng)用詳解

    Flask利用自定義接口實(shí)現(xiàn)mock應(yīng)用詳解

    后端接口已提供,前端需要依賴后端接口返回的數(shù)據(jù)進(jìn)行前端頁面的開發(fā),如何配合前端?這篇就來介紹一下Flask如何利用自定義接口實(shí)現(xiàn)mock應(yīng)用,需要的可以參考一下
    2023-03-03
  • Python即時(shí)網(wǎng)絡(luò)爬蟲項(xiàng)目啟動(dòng)說明詳解

    Python即時(shí)網(wǎng)絡(luò)爬蟲項(xiàng)目啟動(dòng)說明詳解

    這篇文章主要為大家詳細(xì)介紹了Python即時(shí)網(wǎng)絡(luò)爬蟲項(xiàng)目啟動(dòng)說明,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論