激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

香港云服务器
服務器之家 - 腳本之家 - Ruby - Ruby元編程基礎學習筆記整理

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

2020-08-31 13:47lucifercn Ruby

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

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

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

應用示例:

?
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

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

?
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)

 

結果:

?
1
2
3
50
**
60

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

?
1
obj.send(:my_method, 6)

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

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

?
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"

動態派發中使用模式派發(pattern dispatch)的方法。

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

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

?
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)

結果:30

單件方法允許給單個對象增加一個方法。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

結果:

?
1
2
3
false
title?
title?

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

?
1
2
obj.my_method
Cla.class_method

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

?
1
2
3
def obj.method
 # method body
end

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

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

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

?
1
2
3
class << obj
 code
end

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

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

?
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

結果:

?
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個技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby簡潔學習筆記(一):字符串、數字、類和對象

    Ruby簡潔學習筆記(一):字符串、數字、類和對象

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

    腳本之家2472020-04-20
  • RubyCentOS中配置Ruby on Rails環境

    CentOS中配置Ruby on Rails環境

    經過一個上午的折騰,終于把ROR環境在CentOS中搞定,繞了很多彎路,把文章寫下來總結一下 ...

    可樂加糖4762020-04-12
  • RubyRuby設計模式編程中使用Builder建造者模式的實例

    Ruby設計模式編程中使用Builder建造者模式的實例

    這篇文章主要介紹了Ruby設計模式編程中使用Builder建造者模式的實例,建造者模式將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼,數據是隨機的,所以每次的記錄都會不同。 ...

    ruby教程網2962020-04-10
  • RubyRuby環境下安裝使用bundler來管理多版本的gem

    Ruby環境下安裝使用bundler來管理多版本的gem

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

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

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數,只有方法.而且實際上有不止一種方法.這一節我們介紹 訪問控制 (accesscontrols). 想想當我們在最高層而不是在一個類的定義里定義...

    ruby教程網3572020-04-08
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

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

    goldensun2772020-04-25
519
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 亚洲人成中文字幕在线观看 | 日本视频在线免费观看 | fc2成人免费人成在线观看播放 | 黄色免费入口 | 精品成人av一区二区在线播放 | 蜜桃传免费看片www 一本色道精品久久一区二区三区 | 天堂二区| 国产免费网站视频 | 小视频免费在线观看 | 免费观看一区 | 韩国美女一区 | 一级片九九 | 一区二区三区视频在线 | 欧美a v在线 | 内地av在线 | 末成年女av片一区二区 | 欧美成人小视频 | 欧美性猛交一区二区三区精品 | 天堂成人国产精品一区 | 国产一区在线免费 | 性欧美视频在线观看 | 99最新地址 | 黑人三级毛片 | 97干色| 欧美1区2区在线观看 | 激情午夜天| 91看片网页版| 粉嫩粉嫩一区二区三区在线播放 | 国产剧情在线观看一区二区 | 一区二区三区国产在线 | 亚洲一级毛片 | 日本特级a一片免费观看 | 日韩精品网站在线观看 | 成人av一二三区 | 一区国产在线观看 | 99久久精约久久久久久清纯 | 99影视电影电视剧在线播放 | 成人国产精品久久 | 神秘电影91 | 欧洲狠狠鲁 | 国产成人精品免费视频大全最热 |