簡體   English   中英

了解Ruby和Sinatra語法

[英]Understanding Ruby and Sinatra syntax

我需要解密一些Ruby代碼。 作為Python開發人員,我很難理解某些語法。

我需要處理一些(大多是干凈且可讀的)Sinatra代碼。 我從Sinatra教程開始,它看起來像這樣:

get '/' do
    "Hello, World!"
end

現在,我知道在Ruby中,不需要括號即可調用函數。 因此,如果我想了解以上內容,我會說:

  1. get是將路線作為第一個參數的函數。
  2. '/'是第一個參數
  3. do ... end block是一個匿名函數

如果上面我有錯,請糾正我,並詳細說明我可能會丟失的任何內容。

他們還說Sinatra是DSL,這是否意味着它正在解析某些非官方Ruby的特殊語法?

do ... end (或{ ... } )是一個 ,這是Ruby中非常重要的概念。 注意到,經常將其他功能作為參數的功能( mapfiltergreptimeout ...)接受單個功能。 因此,Ruby設計者決定為其制定特殊的語法。

人們常說在Ruby中,一切都是對象。 這不是很正確:代碼不是對象。 可以將代碼包裝到一個對象中。 但是Ruby塊是純代碼-不是對象,根本不是一階值。 塊是與函數調用關聯的一段代碼。

您的代碼段與此等效:

self.get('/') do
    return "Hello, World!"
end

get方法采用一個參數和一個塊; 不是兩個參數。 在一個假設示例中, get確實接受了兩個參數,我們將不得不編寫如下代碼:

get('/', lambda { "Hello, World" })

要么

get('/', Proc.new { "Hello, World" })

但是請注意,將代碼包裝到對象中的方式涉及調用方法lambdaProc.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中,方法有些不同。

  • 除了自變量之外, 任何方法都可以接受代碼塊。
  • 代碼塊不是參數,但是它們是一個單獨的實體,可以與參數一起傳遞給方法
  • 方法可以選擇不調用代碼塊,在這種情況下,將忽略傳遞的任何代碼塊
  • 如果方法調用了代碼塊,則在調用該方法時必須將其傳遞,否則Ruby會抱怨。
  • 方法中的yield執行代碼塊

有關代碼塊的更多信息,請閱讀以下內容: http : //mixandgo.com/blog/mastering-ruby-blocks-in-less-than-5-minutes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM