建立好基本的框架及應用程式後
我們要來把框架做得更完善一點啦!
我們先從建立 debugging 開始
這邊並不是真的寫 debug 功能
而是先用簡單的方式來模擬 debug
在之後我們會再更深入的介紹
module Rainbow
class Application
def call(env)
# 執行時會產生一個 debug.txt檔,並在檔案中印出 debug
`echo debug > debug.txt`
[
200,
{'Content-Type' => 'text/html'},
["Hello from Ruby on Rulers!"]
]
end
end
end
web小辭典
▶ echo:與 puts 一樣是印出的意思
> gem build rainbow.gemspec
Successfully built RubyGem
Name: rainbow
Version: 0.0.1
File: rainbow-0.0.1.gem
> gem install rainbow-0.0.1.gem
啟動後就會建立一個debug.txt的檔案
接下來我們要來做「陣列」
但我們不只要做出來
還要讓使用 Rainbow 框架的應用程式都能用「Array」
定義一個 class Array
在 Array 中定義實體方法
Array new 出來的實體物件就可以使用
(可參考小辭典中的繼承鏈)
# rainbow/lib/rainbow/array.rb
class Array
def deeply_empty?
# empty? 判斷是否為空
# all? 參數都是true 就會回傳 true 否則回傳 false 或 nil
# & 轉成 proc 物件
# 如果是空字串,或者所有物件都為空
empty? || all?(&:empty?)
end
end
web小辭典
▶ ActiveSupport:Rails 中的工具函式庫,像是 Ruby 的擴充工具
常見的 present?、blank?、presence 都是方法之一
▶ 繼承鏈:
Obj 為 classA new 出來的實體物件,會繼承 classA 的所有方法
而 Object 為 classA 的 superclass
所以 classA 會繼承 Object 的所有方法
可以把繼承鏈想像成種族
最上層的 Object 是 classA、Module、Obj 的遠古祖先
這些後輩都會有他留下來的基因(方法)
classA 是其中一種種族,obj 屬於 classA 種族
因此 obj 帶有 classA 的基因(方法)
依此類推
把 Array.rb require 到 rainbow.rb 中
到時候 gem 安裝的時候就會一起載入囉
# /rainbow/lib/rainbow.rb
require "rainbow/array"
需要在這邊把檔案放到 git 暫存區是因為
rainbow.gemspec 會叫 git 去找我們的 gem 包含哪些檔案
讓我們來看看 gemspec 檔案
spec.files = Dir.chdir(__dir__) do
# 把 git 追蹤的所有檔案逐字列出,直到NUL出現,再做後面的方法(split、reject)
`git ls-files -z`.split("\x0").reject do |f|
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
end
end
> gem build rainbow.gemspec
Successfully built RubyGem
Name: rainbow
Version: 0.0.1
File: rainbow-0.0.1.gem
> gem install rainbow-0.0.1.gem
# /quotations/array.rb
a = [1, 3]
p a.sum # 4
這樣就成功建立陣列函式庫囉!
我們明天再來建立測試檔吧!