[英]Understanding Ruby and Sinatra syntax
我需要解密一些Ruby代碼。 作為Python開發人員,我很難理解某些語法。
我需要處理一些(大多是干凈且可讀的)Sinatra代碼。 我從Sinatra教程開始,它看起來像這樣:
get '/' do
"Hello, World!"
end
現在,我知道在Ruby中,不需要括號即可調用函數。 因此,如果我想了解以上內容,我會說:
get
是將路線作為第一個參數的函數。 '/'
是第一個參數 do ... end
block是一個匿名函數 如果上面我有錯,請糾正我,並詳細說明我可能會丟失的任何內容。
他們還說Sinatra是DSL,這是否意味着它正在解析某些非官方Ruby的特殊語法?
do ... end
(或{ ... }
)是一個塊 ,這是Ruby中非常重要的概念。 注意到,經常將其他功能作為參數的功能( map
, filter
, grep
, timeout
...)接受單個功能。 因此,Ruby設計者決定為其制定特殊的語法。
人們常說在Ruby中,一切都是對象。 這不是很正確:代碼不是對象。 可以將代碼包裝到一個對象中。 但是Ruby塊是純代碼-不是對象,根本不是一階值。 塊是與函數調用關聯的一段代碼。
您的代碼段與此等效:
self.get('/') do
return "Hello, World!"
end
get
方法采用一個參數和一個塊; 不是兩個參數。 在一個假設示例中, get
確實接受了兩個參數,我們將不得不編寫如下代碼:
get('/', lambda { "Hello, World" })
要么
get('/', Proc.new { "Hello, World" })
但是請注意,將代碼包裝到對象中的方式涉及調用方法lambda
和Proc.new
並給它們提供一個塊(以及零參數)!
關於“ Ruby塊”的教程很多,因此我不會鏈接任何特定的塊。
由於采用了塊語法,因此Ruby非常擅長制作能夠很好地表達某些概念的方言(仍然是完全語法的Ruby)。 Sinatra使用get...
“語法”(實際上只是一個方法調用)來描述Web服務器。 Rake使用task...
“語法”來描述構建過程; 測試框架RSpec
具有自己的DSL(仍然是Ruby),用於描述所需的行為。
經過閱讀后,我了解了代碼塊。
Ruby代碼塊很簡單。 它們是“關閉”。 有兩種寫塊的方法
do |x|
do_something(x)
end
{|x| do_something(x) }
|x|
是傳遞給塊內代碼的參數。
掌握代碼塊的關鍵是了解它們如何與方法一起使用。
在Ruby中,方法有些不同。
yield
執行代碼塊 有關代碼塊的更多信息,請閱讀以下內容: http : //mixandgo.com/blog/mastering-ruby-blocks-in-less-than-5-minutes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.