# 3.4.5 Ruby
### 3.4.5 Ruby
Ruby也是一門通用編程語言,由松本行弘(Yukihiro Matsumoto)發明,并在1996年達到了1.0版。它的主要特征包括開放類定義(open class)、混合器(mixin)和code block等。
對于Ruby語言的學習,我推薦OReilly出版的[《The Ruby Programming Language》](http://shop.oreilly.com/product/9780596516178.do),其作者之一正是松本行弘。
Ruby在服務器端的編程基于Rack,它是Ruby的一個規范,定義了服務器跟應用程序交互的接口,跟Python的WSGI類似。同樣地,這里“服務器”是指接受客戶端(如瀏覽器)HTTP請求的程序,而“應用程序”是指(由你編寫的)響應HTTP請求的程序。Ruby所有的Web編程框架都基于Rack,包括Rails在內。因此了解、掌握它十分必要[1](#fn_1)。
一個Rack的“Hello,world”程序如下:
```
require 'rack'
app = proc do |env|
['200', {'Content-Type' => 'text/html'}, ['<p>Hello, Rack!</p>']]
end
Rack::Handler::WEBrick.run(app, :Port => 8090, :Host => '0.0.0.0')
```
其中,app就是我們的Rack應用程序。按照Rack規范:
- Rack應用程序可以是任何具有“call”方法的對象。在這里它是一個proc。
- 它帶有一個參數,env,包含了與CGI環境變量類似的輸入。
- 它返回一個數組,包含三個元素,分別是HTTP狀態代碼,應答頭(response header)以及消息主體(message body)。
要運行這個程序首先要安裝rack(一個Ruby Gem,包含用于構建Rack程序的輔助工具,相當于Python的wsgiref包):
```
gem install rack
```
然后在命令行執行(假設程序保存在文件hello.rb中):
```
ruby hello.rb
```
在瀏覽器中訪問`http://localhost:8090/`,即可看到結果。
與Python WSGI相同,Rack也支持**中間件(middleware)**。一個簡單的例子如下(包含三個文件,文件名在首行注釋):
```
# app.rb
class App
def call(env)
['200', {'Content-Type' => 'text/html'}, ['<p>Hello, Rack!</p>']]
end
end
```
```
# middleware.rb
class Middleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
body.each {|line| line.upcase! }
return [status, headers, body]
end
end
```
```
# config.ru
require './app'
require './middleware'
use Middleware
run App.new
```
我們已經說過“Rack應用程序可以是任何具有“call”方法的對象”。在這個例子中,它是一個App類的對象。
中間件也是一個Rack應用程序,但是它“含有”另一個Rack應用程序。Rack服務器調用中間件,傳遞給它一個env參數,并接受它返回的狀態代碼、應答頭部和消息主體。這樣,中間件可以檢查、修改env,并把它傳遞給“內含”的Rack應用程序。它還可以檢查、修改內含的Rack應用程序的返回結果,并返回給上級服務器(也可能是另一個中間件!)。在這個例子中,我們把內部App返回的消息主體字符都轉化成大寫。
雖然簡單,但這是一個產品級的配置:我們使用了config.ru來組裝我們的Rack應用程序和中間件。config.ru是Rack應用程序的標準配置:它指定了Rack應用程序(通過`run`)及中間件(通過`use`),把它們組裝在一起,形成了一個完整的Rack應用。
要運行這個應用程序,在命令行上執行:
```
rackup -p 8090 -o 0.0.0.0
```
然后就可以在瀏覽器中通過`http://localhost:8090/`訪問它。
關于Rack的更多信息,可參考:<https://github.com/rack/rack>。
關于Ruby的Web編程框架,除了著名的[Ruby on Rails](http://rubyonrails.org/),還有[Sinatra](http://www.sinatrarb.com/)(一個小型輕量級框架)等,它們都基于Rack。
> 1. 限于篇幅,這里對Rack只做了簡單的介紹。若想進一步了解Rack,請看我的博文[Ruby Rack及其應用(上)](http://huiming.io/2016/11/10/ruby-rack.html)。[?](#reffn_1 "Jump back to footnote [1] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超鏈接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客戶端請求
- 1.5.2 服務器應答
- 1.5.3 進一步了解HTTP
- 1.6 HTTPS
- 2 Web瀏覽器
- 2.1 HTML
- 2.1.1 文檔類型聲明
- 2.1.2 標簽和屬性
- 2.1.3 文檔結構
- 2.1.4 DOM
- 2.1.5 進一步了解HTML
- 2.2 CSS
- 2.2.1 樣式與樣式表
- 2.2.2 樣式表語法
- 2.2.3 級聯樣式表
- 2.2.4 進一步了解CSS
- 2.3 JavaScript
- 2.3.1 script標簽
- 2.3.2 操縱DOM
- 2.3.3 jQuery
- 2.3.4 進一步了解JavaScript
- 2.4 Ajax
- 2.5 移動設備與響應式Web設計
- 3 Web服務器
- 3.1 方法與資源
- 3.2 狀態代碼
- 3.3 靜態內容與動態內容
- 3.4 編程語言與技術
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服務器架構
- 3.7 Web緩存
- 3.8 服務器推送
- 4 數據庫
- 4.1 關系型數據庫
- 4.2 NoSQL數據庫
- 5 Web服務器的其他組件
- 5.1 Cron
- 5.2 消息隊列
- 5.3 郵件服務器
- 6 開發工具與技術
- 6.1 Git
- 6.1.1 Git基礎操作
- 6.1.2 Git基本原理
- 6.1.3 進一步了解Git
- 6.2 敏捷開發