一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - Ruby元編程基礎(chǔ)學(xué)習(xí)筆記整理

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

2020-08-31 13:47lucifercn Ruby

元編程Metaprogramming是指編寫能夠操作其他程序的程序,例如C語言中的宏,是編程中的一項(xiàng)高級(jí)技巧,這里我們立足基礎(chǔ),來看一下Ruby元編程基礎(chǔ)學(xué)習(xí)筆記整理.

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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)用示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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)

分別輸出

?
1
Constant, Instance Attribute, Instance Method

筆記二:動(dòng)態(tài)調(diào)用
當(dāng)你調(diào)用一個(gè)方法時(shí),實(shí)際是給一個(gè)對(duì)象發(fā)送了一條消息。

?
1
2
3
4
5
6
7
8
9
10
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é)果:

?
1
2
3
50
**
60

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

?
1
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)用來表示事物的名字。
例如:

?
1
2
3
4
5
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)的方法。

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

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

?
1
2
3
4
5
6
7
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

?
1
2
3
4
5
6
7
8
9
# 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é)果:

?
1
2
3
false
title?
title?

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

?
1
2
obj.my_method
Cla.class_method

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

?
1
2
3
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作用域:

?
1
2
3
class << obj
 code
end

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 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é)果:

?
1
2
3
4
5
6
7
8
9
lion
cat
cat
tiger
tiger
dog
dog
 
dog

延伸 · 閱讀

精彩推薦
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    這篇文章主要介紹了Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
主站蜘蛛池模板: 强迫高h | 15同性同志18 | 爱爱一级视频 | 国产卡一卡二卡四卡无卡 | 天美影视传媒mv直接看 | 高清在线观看mv的网址免费 | 欧美日韩在线一区二区三区 | 欧美胖逼 | 9久热久爱免费精品视频在线观看 | 色老板美国在线观看 | 成人国产精品一区二区不卡 | 日本高清视频网站 | 欧美日韩精品一区二区三区视频播放 | 青春草视频在线免费观看 | 亚洲H成年动漫在线观看不卡 | 好猛好紧好硬使劲好大刺激视频 | 国产欧美视频高清va在线观看 | 午夜影院免费入口 | 高清男的插曲女的 欢迎你老狼 | 国产精品国产精品国产三级普 | 白发在线视频播放观看免费 | 九九在线精品亚洲国产 | 日本高清中文字幕视频在线 | 亚洲天堂男人天堂 | 欧美男同video| 日本黄色高清视频网站 | 免费观看欧美一级高清 | 国产91精选学生在线观看 | 91综合在线视频 | 交欧美| 日韩在线天堂 | japanesqirl日本护士 | 久久精品久久久久 | 日韩精品中文字幕久久 | 爱操综合 | 欧美乱强| 精品久久久久久 | 800精品国产导航 | 国产动作大片 | 齐天大性之七仙女欲春迅雷链接 | 亚洲精品免费视频 |