2011-12-12 27 views
3

能爲我這樣的人解釋從幸運僵硬的露營微架構的這部分代碼:接收露營的路徑構建方法

# Simply builds a complete path from a path +p+ within the app. If your 
# application is mounted at <tt>/blog</tt>: 
# 
# self/"/view/1" #=> "/blog/view/1" 
# self/"styles.css" #=> "styles.css" 
# self/R(Edit, 1) #=> "/blog/edit/1" 
# 
def /(p); p[0] == ?/ ? @root + p : p end 

Source

回答

4
def /(p); 

方法名稱爲「/」參數'p'

p[0] == ?/ 

檢查字符串是否以'/'開頭。問號用於指定字符被逐字使用。您也可以認爲它與'/'相同

p[0] == ?/ ? exp1:exp2 

第二個問號用於條件評估。如果表達式(p [0] ==?/)爲真,則評估exp1否則評估exp2。

因此,在上述情況下,如果字符串參數以'/'開頭,則返回值爲@root + p的值,該值由root加上。另一方面,如果參數不是以'/'開始,那麼按照原樣返回。

+1

感謝您的解釋。問號操作員讓我困惑。 –

0

這裏是另一種方式來寫它:

def /(p) 
    if p[0] == ?/ 
    @root + p 
    else 
    p 
    end 
end 

p[0]字符串中返回的第一個字符。 ?/返回/字符。請注意,在1.8中,一個字符由整數(?/ == 47)表示,而在1.9中則爲一個字符的字符串(?/ == "/")。儘管如此,p[0]將始終與?/一致。

因此,在更高層次上,它會檢查字符串中的第一個字符是否爲斜槓,如果是,則它將前導@root(它在Camping :: Base#initialize中設置)。

因此,如果您的應用程序安裝在/ blog,@root == "/blog"self/"/post/1" == "/blog/post/1"