理解Ruby和Sinatra语法

时间:2015-11-27 00:32:57

标签: ruby sinatra

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

我需要处理一些(大多数是干净且可读的)Sinatra代码。我从Sinatra tutorial开始,它看起来像这样:

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

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

  1. get是一个函数,它将路径作为第一个参数。
  2. '/'是第一个参数
  3. do ... end阻止是一个匿名函数
  4. 如果我错了,请纠正我,并详细解释我可能遗失的任何内容。

    他们也说Sinatra是一个DSL - 这是否意味着它正在解析一些非官方Ruby的特殊语法?

2 个答案:

答案 0 :(得分:3)

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),描述了所需的行为。

答案 1 :(得分: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