--- title: 附錄:Head First 沒有涵蓋的酷東西 tags: Ruby, Study description: Head First Ruby View the slide with "Slide Mode". # slideOptions: # theme: simple --- # 其他好用函式庫 ## Ruby on Rails 使用 Model, View, Controller (MVC) 模式建構網頁應用程式: Ruby on Rails (RoR) 是一個基於MVC(Model-View-Controller)設計模式的Web應用程式框架。這種設計模式有助於將應用程式的不同方面分離,使得代碼更容易維護、擴展和測試。 以下是MVC在Ruby on Rails中的簡要說明: 1. **Model(模型):** - 模型是與數據相關的部分,負責處理應用程式的數據邏輯。 - 在Ruby on Rails中,模型通常與資料庫表格相關聯,並包含與數據存取和操作相關的方法。 - ActiveRecord是Ruby on Rails中常用的模型層的實現,它提供了數據庫操作的抽象層。 2. **View(視圖):** - 視圖負責呈現應用程式的用戶界面。 - 在Ruby on Rails中,視圖通常是由HTML和ERB(Embedded Ruby)組成,ERB允許在HTML中嵌入Ruby代碼以動態生成內容。 - 視圖獲取模型的數據並將其呈現為最終的用戶界面。 3. **Controller(控制器):** - 控制器是應用程式的中樞,處理用戶的請求並協調模型和視圖之間的交互。 - 在Ruby on Rails中,控制器通常包含一組動作(actions),每個動作對應到一個特定的用戶請求。 - 控制器負責調用相應的模型方法來檢索或修改數據,然後將結果傳遞給視圖進行呈現。 MVC設計模式的主要優勢在於它能夠將應用程式的不同方面進行有效的分離,使得每個部分都可以單獨進行測試、修改和擴展,提高了代碼的可維護性和可擴展性。 ![httpatomoreillycomsourceoreillyimages2236846.png](https://hackmd.io/_uploads/B1xfZccOp.jpg) 商業邏輯是指應用程式中處理業務需求和規則的邏輯部分。這些需求和規則通常與特定行業或業務領域相關,並且可能包括各種業務過程、計算、判斷、驗證等。在Ruby on Rails中,商業邏輯主要會被歸類在模型(Model)部分。 具體來說,商業邏輯的實現可能包括以下方面: 1. **業務規則:** - 定義了應用程式在特定情境下應該如何運作的規則。這可能涉及價格計算、折扣邏輯、訂單處理規則等。 2. **資料驗證:** - 確保數據的一致性和有效性,例如檢查使用者輸入的資料是否符合預期的格式和範圍。 3. **業務過程和工作流:** - 定義了應用程式中不同功能之間的流程和相互作用,以實現完整的業務過程。 4. **權限和安全性:** - 處理用戶權限、角色和數據訪問的相關邏輯,確保只有授權的用戶能夠執行特定的操作。 5. **計算邏輯:** - 執行特定計算,例如稅金計算、庫存管理、金融計算等。 這些方法可以被控制器調用,以處理用戶請求,同時維護模型和數據的一致性。這樣的設計使得商業邏輯可以被重用、測試和維護。 ## dRuby Distributed Ruby,讓 ruby 腳本能夠遠端執行。具有簡易的 client server 結構,不需要實作網路連線的處理,直接啓動 service 就能遠端執行腳本。 ### Server 定時印出本地 array 內容,可以觀察到 client 修改了本地 array 的狀態。 ![httpatomoreillycomsourceoreillyimages2236848.png](https://hackmd.io/_uploads/B17wQ5qOT.jpg) ### Client 經由網路連結到 server ![httpatomoreillycomsourceoreillyimages2236850.png](https://hackmd.io/_uploads/rkwDXqqOT.jpg) 在dRuby中,`DRbObject`(Distributed Ruby Object)是一個代理(Proxy)對象。代理模式是一種結構型設計模式,它允許一個對象充當另一個對象的接口,以便控制對這個對象的訪問。 `DRbObject`作為代理,提供了在分散式Ruby(dRuby)系統中訪問遠程對象的機制。它具體提供以下功能: 1. **遠程方法調用:** - `DRbObject`允許你調用遠程對象上的方法,就像調用本地對象的方法一樣。這使得你可以透明地使用遠程對象,而無需擔心底層的通信和遠程呼叫的實現細節。 2. **對象序列化和反序列化:** - dRuby使用對象序列化技術來實現對象的跨進程通信。`DRbObject`負責將方法調用轉換為適當的消息,並將對象序列化以在不同進程之間傳遞。 3. **透明的分散式物件訪問:** - 通過`DRbObject`,你可以在本地透明地使用遠程對象,就好像它們是本地的一樣。這樣的透明性使得你可以將分散式系統中的對象視為本地對象,簡化了分散式程式設計。 4. **動態類型轉換:** - `DRbObject`提供了動態的類型轉換,使得遠程對象的方法可以被適當地呼叫和處理。這使得在分散式系統中傳遞的對象能夠適應不同的環境。 總的來說,`DRbObject`作為一個代理,使得在dRuby分散式系統中透明地使用遠程對象成為可能,提供了一種簡單而強大的機制來實現分散式程式設計。 ## CSV CSV 包含在基楚函式庫中,提供使用 title 作爲 key 的方式取得指定 column 的值。 ![httpatomoreillycomsourceoreillyimages2236858.png](https://hackmd.io/_uploads/Sk63scq_T.jpg) # Inline if and unless 一行表示 if 與 unless ## `if` ### Regular ```ruby if true put "ccc" end ``` ### Inline ```ruby put "ccc" if true ``` ## `unless` ### Regular ```ruby unless true put "ccc" end ``` ### Inline ```ruby put "ccc" unless true ``` # Private method 限制物件使用方式,將限定使用方式的 method 隱藏,避免其他人誤用。 [httpatomoreillycomsourceoreillyimages2236866.png](https://hackmd.io/_uploads/H1TCTqqua.jpg) 在Ruby中,`private` 關鍵字用於聲明方法為私有方法,意味著這些方法只能在該類別的實例內部被呼叫,不能直接從實例外部呼叫。然而,Ruby的私有方法在某些情況下並非嚴格的私有性,這可能是導致說Ruby的private method不是真正的private的原因之一。 以下是一些有關Ruby私有方法的特性: 1. **繼承子類可以訪問父類的私有方法:** - 子類可以訪問其父類的私有方法。這是因為在Ruby中,子類被視為是父類的擴展,因此子類的實例可以訪問父類的私有方法。 ```ruby class MyClass private def my_private_method puts "This is a private method" end end class Child < MyClass def child_method my_private_method end end obj = Child.new obj.child_method # 子類的實例可以訪問父類的私有方法 ``` 2. **使用send方法:** Ruby提供了send方法,它可以繞過對方法的訪問控制,並呼叫任何方法,包括私有方法。 ```ruby class MyClass private def my_private_method puts "This is a private method" end end obj = MyClass.new obj.send(:my_private_method) # 使用 send 方法呼叫私有方法 ``` 這樣的方式雖然能夠實現,但是不建議在實際應用中使用,因為它違反了物件封裝的原則,並可能導致代碼難以理解和維護。 儘管以上情況可能被視為某種程度上的彈性,但這也意味著在實際應用中,開發者需要謹慎使用私有方法,以確保設計的一致性和安全性。在Ruby中,一些開發者可能會選擇使用命名慣例(例如在方法名前加上底線)而不是使用private方法,以確保某些方法只在內部使用。 # Command-line arguments 使用 ARGV 將參數帶入腳本 ![httpatomoreillycomsourceoreillyimages2236876.png](https://hackmd.io/_uploads/SyQnWiqu6.jpg) ![httpatomoreillycomsourceoreillyimages2236878.png](https://hackmd.io/_uploads/S1Dnbo9O6.jpg) # Regular expressions 正規表達式(Regular Expression)是用來描述一組字串匹配規則的表示法,它在Ruby中有廣泛的應用。 ### 優缺點: **優點:** - **強大的字串處理工具:** 正規表達式提供了強大的模式匹配和替換功能,可以有效地處理字串。 - **彈性:** 可以通過組合不同的模式元素,創建高度靈活的匹配條件。 - **標準化:** 正規表達式是一種標準的表示法,跨足多種程式語言,具有高度的可重用性。 **缺點:** - **學習曲線:** 正規表達式的語法可能相對複雜,需要時間和實踐來掌握。 - **可讀性差:** 复雜的正規表達式可能難以理解和維護,容易產生錯誤。 ### 使用情境: - **字串搜索和擷取:** 當需要在大量文本中搜尋特定模式的字串或從字串中提取特定信息時。 - **表單驗證:** 用於確保用戶輸入的數據符合特定的格式和標準。 - **日誌處理:** 用於分析和提取日誌文件中的信息。 - **文本轉換:** 當需要對文本進行複雜的替換或轉換時。 ### Ruby 特殊用法: Ruby 的正規表達式(Regular Expressions)在語法和特性上與其他語言的正規表達式有一些相似之處,同時也有一些特殊之處。以下是 Ruby 中正規表達式的一些特點: #### 1. **嵌入式選項修飾符(Inline Option Modifier):** 在 Ruby 中,可以在正規表達式中使用嵌入式選項修飾符,這使得你可以在正規表達式的中間指定選項,而不是只能在開頭指定。例如,`/pattern/i` 可以被寫作 `/pattern(?i)/`。 ```ruby str = "Hello World" result = str =~ /world(?i)/ # 不區分大小寫匹配 ``` 正規表達式的結束定界符號之後可以跟隨一個或多個單字母選項,用於控制模式的匹配方式。 - /pat/i - 忽略大小寫 - /pat/m - 把換行視為被 . 匹配的字元 - /pat/x - 忽略模式中的空白和註解 - /pat/o - 僅執行 #{} 插值一次 ##### /pat/o - 僅執行 #{} 插值一次 當你使用 `/pat/o` 時,其中的正規表達式模式中的 `#{}` 插值只會在第一次模式被定義時被計算和插入。之後,這個模式將保持不變,即使變數的值發生變化。 舉例來說: ```ruby name = "John" pattern = /Hello, #{name}/o puts pattern =~ "Hello, John" # 匹配成功 puts pattern =~ "Hello, Mike" # 不匹配,因為插值只發生一次 ``` 在這個例子中,正規表達式模式 `/Hello, #{name}/o` 在第一次使用時,`#{name}` 會被插入成 `"John"`,之後即使 `name` 的值改變,正規表達式模式仍然保持不變。 這種特性有助於提高性能,因為它避免了在每次匹配時都重新計算插值的成本。然而,它也表示如果模式中包含動態的內容,只有在第一次定義模式時會被考慮。 #### 2. **特殊全局變數:** Ruby 中有一些特殊的全局變數與正規表達式相關,例如 `$1`、`$2` 等,這些變數用於存儲正規表達式匹配的結果。這些變數是在 `=~` 運算符或 `match` 方法中被自動設置的。 ```ruby str = "Hello 123" str =~ /(\d+)/ puts $1 # 輸出匹配的數字 "123" ``` ![httpatomoreillycomsourceoreillyimages2236894.png](https://hackmd.io/_uploads/r1JOcL0_T.jpg) #### 3. **`String` 類別的 `scan` 方法:** Ruby 中的 `String` 類別提供了 `scan` 方法,可以使用正規表達式進行全局匹配,並將所有匹配的結果返回為一個數組。 ```ruby str = "apple banana orange" matches = str.scan(/\b\w+\b/) puts matches # 輸出 ["apple", "banana", "orange"] ``` #### 4. **`Regexp` 類別的 `union` 方法:** Ruby 中的 `Regexp` 類別提供了 `union` 方法,可以用來合併多個正規表達式。 ```ruby pattern1 = /hello/ pattern2 = /world/ combined_pattern = Regexp.union(pattern1, pattern2) ``` #### 5. **反斜線轉譯:** Ruby 中反斜線 `\` 的轉譯規則與一些其他語言有所不同,需要注意在正規表達式中使用時的區別。 ```ruby pattern = /\w+\\d+/ ``` 可以使用 `%R{}` 避免 `\` 的轉譯規則 ### 學習資源: 1. **[Ruby 正規表達式指南](https://rubular.com/):** - 在線工具 Rubular 提供互動式的Ruby正規表達式測試和學習。 2. **《[The Ruby Programming Language](https://www.amazon.com/Ruby-Programming-Language-David-Flanagan/dp/0596516177)》 by David Flanagan and Yukihiro Matsumoto:** - 這本書包含了關於Ruby語言和正規表達式的詳細信息。 3. **[Ruby 正規表達式文檔](https://ruby-doc.org/core-3.0.2/Regexp.html):** - Ruby官方文檔提供了關於正規表達式的完整信息,是學習的良好資源。 4. **[RegexOne - Learn Regular Expressions with simple, interactive exercises](https://regexone.com/):** - 互動式的線上學習平台,通過簡單的例子和練習來教授正規表達式的基礎知識。