首頁 後端開發 Python教學 Ruby元程式設計基礎學習筆記整理

Ruby元程式設計基礎學習筆記整理

Jul 22, 2016 am 08:56 AM
ruby 元程式設計

筆記一:
程式碼中包含變量,類別和方法,統稱為語言建構(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
登入後複製

筆記二:動態呼叫
當你呼叫一個方法時,實際上是給一個物件發送了一條訊息。

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()方法第一個參數是要傳送給物件的訊息,可以是符號(:symbol)或字串,其他參數會直接傳遞給呼叫的方法。
可以動態的決定呼叫哪個方法的技術,成為Dynamic Dispatch。

筆記三:符號和字串的區別
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"
登入後複製

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

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

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

class MyClass
 define_method :my_method do |args|
  args * 3
 end
end
obj = MyClass.new
puts obj.my_method(10)
登入後複製

結果:<code><font face="Courier New">30</font><br /> 30


單件方法允許給單一物件增加一個方法。 singleton methods
# test.rb
str = "My name is caoqing."
def str.title&#63;
 self.upcase == self
end

puts str.title&#63;
puts str.methods.grep(/^title&#63;/)
puts str.singleton_methods

登入後複製


結果:
false
title&#63;
title&#63;
登入後複製


筆記五:

類別方法的本質,類別是對象,類別名稱是常數。在類別上呼叫方法和物件呼叫方法一樣:
obj.my_method
Cla.class_method
登入後複製



Duck Typing:物件能不能回應方法,可以是普通方法或單件方法。

類別方法的實質就是他們是類別的一個單件方法。
def obj.method
 # method body
end
登入後複製

obj可以是物件引用,常數類別名稱或self。
類別宏(Class Macro)

Ruby物件沒有屬性,可以使用擬態方法定義屬性。

Module#attr_*()方法中的一員來定義存取器。類別宏不是關鍵字而是方法。
Eigenclass

單件方法依照常規的方法找出在祖先鏈無法找到保存的地方,obj是物件不能保存,也不能存在於class內,否則所有的實例都可以共享這個方法。
物件擁有一個獨特的隱藏類,稱為該物件的eigenclass。

進入eigenclass作用域:
class << obj
 code
end
登入後複製

如果想要取得eigenclass的引用,則可以在離開該作用域時傳回self:
附錄:

類別變量,實例變量,類別方法,實例方法區別
@@                           :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

登入後複製

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
C++中的模板元程式設計面試常見問題 C++中的模板元程式設計面試常見問題 Aug 22, 2023 pm 03:33 PM

C++是一門廣泛應用於各領域的程式語言,其模板元程式設計是一種高階程式技術,可讓程式設計師在編譯時對類型和數值進行變換。在C++中,模板元程式設計是一個廣泛討論的話題,因此在面試中,與此相關的問題也是相當常見的。以下是一些可能會被問到的C++中的模板元程式設計面試常見問題。什麼是模板元程式設計?模板元程式設計是一種在編譯時操作類型和數值的技術。它使用模板和元函數來根據類型和值生成

深入分析 Golang 與 Ruby 的異同 深入分析 Golang 與 Ruby 的異同 Jun 01, 2024 pm 08:46 PM

Go與Ruby的主要區別在於:Go是一種靜態類型編譯語言,支援輕量級並行和高效記憶體管理,適合編寫高並發應用程式;Ruby是一種動態類型解釋語言,支援真正的平行但記憶體管理需手動控制,適合編寫靈活的Web應用程式。

Golang語言特性探索:程式碼自動產生與元程式設計 Golang語言特性探索:程式碼自動產生與元程式設計 Jul 17, 2023 pm 07:33 PM

Golang語言特性探索:程式碼自動產生與元程式設計引言:Golang作為一門現代化的程式語言,具有簡潔、高效和並發性強等諸多優勢。除了這些基本特性之外,Golang還提供了一些進階的特性,如程式碼自動產生和元程式設計。本文將深入探討這兩個特性,並透過程式碼範例來展示它們的使用。一、程式碼自動產生程式碼自動產生是一種透過編寫模板程式碼來產生特定程式碼的技術。這種技術可以減少重複性

C++ 元程式設計在高效能運算中如何發揮作用? C++ 元程式設計在高效能運算中如何發揮作用? Jun 01, 2024 pm 05:31 PM

C++元程式設計在HPC中發揮著至關重要的作用,透過其操作和產生程式碼的能力,它為最佳化程式碼效能和可維護性提供了強大的工具。具體應用包括:SIMD向量化:建立針對特定SIMD處理器客製化的程式碼,以利用處理器能力,提升效能。程式碼產生:使用模板動態建立和優化程式碼,提高程式碼的可維護性。內省:在運行時查看和修改程式碼結構,增強程式碼的可調試性和靈活性。元資料程式設計:處理資料和元資料之間的關係,實現資料驅動的程式設計。

golang 反射在元程式設計和程式碼產生的應用 golang 反射在元程式設計和程式碼產生的應用 May 03, 2024 pm 09:30 PM

反射在Go語言中的元程式設計和程式碼產生中十分有用:元程式設計:允許程式在運行時創建新類型、函數和變量,修改現有類型結構。程式碼產生:可以動態產生程式碼片段,並在運行時執行它們,例如產生實作特定介面的函數。

Ruby怎麼使用Mysql2連接操作MySQL Ruby怎麼使用Mysql2連接操作MySQL Apr 17, 2023 pm 10:07 PM

Ruby操作MySQL使用mysql2連接mysql並操作mysql。 geminstallmysql2連接mysql建立連線:require'mysql2'conn=Mysql2::Client.new({host:'192.168.200.73',username:'root',password:'P@ssword1!'})接受的連線選項包括: Mysql2::Clie

為什麼 Python、Ruby 等語言棄用了自增運算子? 為什麼 Python、Ruby 等語言棄用了自增運算子? May 11, 2023 pm 04:37 PM

許多人或許會注意到一個現象,那就是在一些現代程式語言(當然,並不是指「最近出現」的程式語言)中,自增和自減運算子被取消了。也就是說,在這些語言中不存在i++i​​n或這樣的表達,而是只存在i+=1j-=1這樣的表達方式了。本回答將從設計哲學這個角度探討這現象所產生的背景與原因。嚴格來說,說"i++正在消失"也許有失偏頗,因為主流程式語言中似乎只有Python、Rust和Swift不支援自增自減運算子。當我第一次接觸Python時,這也

C++ 元程式設計在保證程式碼安全性和正確性方面的角色? C++ 元程式設計在保證程式碼安全性和正確性方面的角色? Jun 02, 2024 pm 08:17 PM

元编程可显著提高C++代码的安全性、正确性和可维护性。其基于以下能力:检查代码中的类型信息,以实现静态断言。使用模板形而上学生成类型安全的代码。在错误处理中静态检查错误条件。

See all articles