2015-11-27 55 views
0

我需要解密一些Ruby代码。作为一名Python开发人员,我很难理解一些语法。了解Ruby和Sinatra语法

我需要处理一些(主要是干净可读的)Sinatra代码。我开始用Sinatra tutorial,它看起来是这样的:

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

现在,我知道,在Ruby中,你不需要括号调用函数。因此,如果我想了解上述内容,我会说:

  1. get是一个函数,它将第一个参数作为路由。
  2. '/'是第一个参数
  3. do ... end块是一个匿名函数

请纠正我,如果我错了上面,并详细什么我可能会丢失解释。

他们还说Sinatra是一个DSL--这是否意味着它解析了一些不是官方Ruby的特殊语法?

+1

你上点1-3正确(尽管Ruby的块是不是一个匿名函数*本身*,并非全部不同)。 Sinatra是一个DSL,但不是它不使用任何非Ruby语法。 –

回答

3

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" }) 

但是请注意,我们总结代码到对象的方式需要调用方法lambdaProc.new - 并给他们一个块(和零参数)!

有很多关于“Ruby块”的教程,所以我不会链接任何特定的教程。

由于块语法的缘故,Ruby非常擅长用非常整齐地表达某些概念的方言(仍然是完整的句法Ruby)。Sinatra使用get...“语法”(但实际上只是一个方法调用)来描述Web服务器; Rake使用task...“语法”来描述构建过程;测试框架RSpec拥有自己的描述所需行为的DSL(仍然是Ruby)。

1

经过一番阅读,我了解了代码块。

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

+0

很好的答案,很高兴你有一些见解。尽管Ruby块不是关闭的,但它们*可以*。请参阅[本聊天](http://www.artima.com/intv/closures.html)与Matz(Ruby的创建者)和[本文有用的文章](http://www.reactive.io/tips/2008/12/21/understanding-ruby-blocks-procs-and-lambdas /)来获取块,proc和lambdas背后的细微差别。 – iain