Time of Update: 2017-01-18
建立 Rails 項目建立一個普通的 Rails 項目,可以直接使用以下命令:rails new blog但在國內因為串連 RubyGems 的速度太慢,而 Rails 預設在構建完項目結構後,會使用 bundle 命令從 RubyGems 下載安裝依賴包。最後會因為網路問題而卡死。所以需要使用 --skip-bundle 參數跳過執行 bundle 這一步。然後使用國內的 Gems 鏡像源來完成後面依賴包的安裝。國內推薦的源是 Ruby China 提供的:
Time of Update: 2017-01-18
關於雜湊先來瞭解一下Hash的基本思路:設要儲存物件的個數為num, 那麼我們就用len個記憶體單元來儲存它們(len>=num); 以每個對象ki的關鍵字為自變數,用一個函數h(ki)來映射出ki的記憶體位址,也就是ki的下標,將ki對象的元素內容全部存入這個地址中就行了。這個就是Hash的基本思路。為什麼要用一個函數來映射出它們的地址單元呢?假設現在我要儲存4個元素 13 7 14 11顯然,我們可以用數組來存。也就是:a[1] = 13; a[2] = 7; a[3] = 14;
Time of Update: 2017-01-18
Ruby是一種解釋型、物件導向、動態類型的語言。Ruby採取的策略是在靈活性和運行時安全之間尋找平衡點。隨著Rails架構的出現,Ruby也在2006年前後一鳴驚人,同時也指引人們重新找回編程樂趣。儘管從執行速度上說,Ruby談不上有多高效,但它卻能讓程式員的編程效率大幅提高。本文將講述Ruby語言的基礎語言特性,包括基本的文法及代碼塊和類的定義。1. 基礎在Ruby互動命令列中輸入以下命令(>>為命令列提示符,=>為傳回值;下文將把=>符號和語句寫在一行內表明其傳回值)
Time of Update: 2017-01-18
基礎將一個記錄插入到一個已經排序好的表中,以得到一個記錄增一的有序表。並且最關鍵的一點就是它把比當前元素大的記錄都往後移動,用以空出“自己”該插入的位置。當n-1趟插入完成後該記錄就是有序序列。def insertSort(tarray) i=1 while(i < tarray.size) do if tarray[i] < tarray[i-1] j=i-1 x=tarray[i] #puts x.class #puts
Time of Update: 2017-01-18
通過使用鉤子方法,可以讓我們在Ruby的類或模組的生命週期中進行幹預,可以極大的提高編程的靈活性。與生命週期相關的鉤子方法有下面這些:類與模組相關 Class#inherited Module#include Module#prepended Module#extend_object Module#method_added Module#method_removed Module#method_undefined單件類相關
Time of Update: 2017-01-18
rack是ruby伺服器和rack應用程式之間的一個架構,rails,sinatra都是基於rack構建的,都屬於rack應用程式。rack提供了一個標準的介面,用於與伺服器進行互動。標準的rack程式是一個可以響應call的對象,可以是對象、Proc、lambda甚至是method,它接收env參數(環境對象),返回一個數組,數組包括: 狀態(status),http響應狀態代碼 可以是hash,為http的header資訊
Time of Update: 2017-01-18
鉤子方法有些類似事件驅動裝置,可以在特定的事件發生後執行特定的回呼函數,這個回呼函數就是鉤子方法(更形象的描述: 鉤子方法可以像鉤子一樣,勾住一個特定的事件。),在Rails中before\after函數就是最常見的鉤子方法。Class#inherited方法也是這樣一個鉤子方法,當一個類被繼承時,Ruby會調用該方法。預設情況下,Class#inherited什麼都不做,但是通過繼承,我們可以攔截該事件,對感興趣的繼承事件作出回應。class String def
Time of Update: 2017-01-18
類方法類方法其實質是生活在該類的單件類中的單件方法。其定義方法有三種,分別是:# 法一def MyClass.a_class_method; end# 法二class MyClass def self.anther_class_method; endend# 法三*class MyClass class << self def yet_another_class_method; end
Time of Update: 2017-01-18
單件方法Ruby允許給單個對象增加方法,這種只針對單個對象生效的方法,稱為單件方法範例程式碼str = “just a regular string”def str.title? self.upcase == selfendstr.title? # => falsestr.methods.grep(/title?/) # => [:title?]str.singleton_methods #=> [:title?]str.class
Time of Update: 2017-01-18
有了rbenv來管理多版本的ruby環境,我們還需要一個能管理多版本gem(比如rails)的工具,那就是bundler了,項目背景不細說了,需要瞭解的直接到官網http://bundler.io/,這裡只講一些實際使用經驗。安裝gem install bundler使用mkdir app1; cd app1;echo "source 'https://ruby.taobao.org/'" > Gemfileecho "gem 'rails,'4.1.0'" >>
Time of Update: 2017-01-18
不知道你有沒有把資料移轉寫入Migration檔案的經曆,相信無論是老鳥還是新手都這樣幹過吧。事實上,這樣做並不是行不通,只不過這樣的實踐慢慢會給你引入一些不必要的麻煩。一般認為db/migrate檔案夾裡的內容是關於你資料庫Schema的演變過程,每個新的開發或線上環境都要通過這些Migration來構建可用的資料庫。但如果這裡裝入了,負責細節的業務代碼,比如一些曆史遺留資料的遷移代碼之類的,當一段時間後,資料庫的結構變化了,但Migration沒有跟著變化,漸漸的曾經的輔助代碼,就成了垃圾代
Time of Update: 2017-01-18
演算法原理:比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後一個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。實現假設有這樣一個數組: [4, 1, 3, 2]冒泡排序為從第一個數開始,吧這個數與後面的數比較,如果這個數比後面的大,就交換他們的位置。比如,第一次比較4和1,發現4比1大,交換 -> [1, 4, 3,
Time of Update: 2017-01-18
在rails中,發送一個請求(/users)的處理全過程如下: 1)、瀏覽器發送請求(/users) 2)、Rails的 routes會把請求路由給users_controller的index方法 3)、users_controller回調用User Model擷取所有的user 4)、User Model會從資料庫中把所有的user讀取出來, 5)、User Model把從資料庫讀取出來的所有user封裝為List返回給user_controller
Time of Update: 2017-01-18
原始碼布局方面: 1、所有源檔案以UTF-8編碼 2、使用2個空格的縮排 3、使用Unix風格的分行符號(\n),windows(\r\n)。可使用git config --global core.autocrlf true 防止產生windows風格的分行符號。 4、在‘,',‘;'後,操作符(除指數操作之外),‘{',‘}'的前後增加空格,增加代碼的可讀性。 5、在‘(',‘)',‘[',‘]'符號後不要加空格。 6、Case和When處於同一代碼層次。 7、2個def之間使用一個空行隔開
Time of Update: 2017-01-18
何謂猴子補丁(Monkey Patch)?在動態語言中,不修改原始碼而對功能進行追加和變更。使用猴子補丁的目的: 1、追加功能 2、功能變更 3、修正程式錯誤 4、增加鉤子,在執行某個方法的同時執行一些其他的處理,如列印日誌,實現AOP等, 5、緩衝,在計算量很大,結算之後的結果可以反覆使用的情況下,在一次計算完成之後,對方法進行替換可以提高處理速度。Ruby的類都是開放類,即在類定義之後還可以任意新增內容,
Time of Update: 2017-01-18
開啟類和猴子補丁 在Ruby中,類定義的方法和其他的語句沒有任何區別,都是一行一行的執行下去的。如下例子:class Example def method_1 puts "method 1" end end class Example def method_2 puts "method 2" end end 本例中,當第一次定義Class
Time of Update: 2017-01-18
一,塊的聲明 塊的聲明在函數調用之後,用{..}括起來,或do..end封裝。{}一般用在單行語句上,do..end用在多行語句上。(1..4).each{|v| print "#{v} "} #輸出1 2 3 4 塊可以帶參數,與函數參數不同,塊參數用||封裝,當然,可以帶多個參數。這些參數怎麼定義,實際上是在函數內部定義好的,後面會講到。二,塊內變數的訪問 塊內可以訪問塊外的變數,也就是塊外的變數在塊內是可見的,如sum = 0
Time of Update: 2017-01-18
block是什嗎?在Ruby中,block並不罕見。官方對block的定義是“一段被包裹著的代碼”。當然,我覺得這樣的解釋不會讓你變的更明白。對block的一種更簡單的描述是“一個block就是一段儲存在一個變數中的代碼,它和其他的對象一樣,可以被隨時的運行”然後,咱們通過看一些代碼,之後再把這些代碼重構成Ruby中的block形式。通過代碼來實際的感受,更加直觀。比如,對兩個數做加法?puts 5 + 6# => 11嗯,這樣寫是可以的。但是,這樣的代碼只做到了block定義的前半部分—
Time of Update: 2017-01-18
1、什麼是代碼塊在Ruby中,{}或do...end之間的代碼是一個代碼塊。代碼塊只能出現在一個方法的後邊,它緊接在方法最後一個參數的同一行上,由yield關鍵字調用。例如:[1,2,3,4,5].each { |i| puts i }[1,2,3,4,5].each do |i| puts iend塊變數:以yield關鍵字調用block也可以傳遞參數,block中豎線(|)之間給出的參數名用於接收來自yield的參數。 豎線之間(如上例中的 | i
Time of Update: 2017-01-18
Proc是對塊及其context(局部變數的範圍以及棧架構)進行對象化處理之後得到的過程對象。您可以像使用無名函數那樣來使用Proc,但它不會匯入局部變數的範圍(可以把動態局部變數用作Proc局部變數)。在下例中,正因為Proc一直保持著局部變數的範圍,所以才能調用var變數。var = 1$foo = Proc.new { var }var = 2def foo $foo.callendp foo # =>