我需要解密一些Ruby代码。作为一个Python开发人员,我很难理解一些语法。
我需要处理一些(大多数是干净且可读的)Sinatra代码。我从Sinatra tutorial开始,它看起来像这样:
get '/' do
"Hello, World!"
end
现在,我知道在Ruby中你不需要括号来调用函数。因此,如果我试图理解上述内容,我会说:
get
是一个函数,它将路径作为第一个参数。'/'
是第一个参数do ... end
阻止是一个匿名函数如果我错了,请纠正我,并详细解释我可能遗失的任何内容。
他们也说Sinatra是一个DSL - 这是否意味着它正在解析一些非官方Ruby的特殊语法?
答案 0 :(得分: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" })
但请注意我们将代码包装到对象中的方式涉及调用方法lambda
和Proc.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中,方法有点不同。
yield
执行代码块有关代码块的更多信息,请阅读:http://mixandgo.com/blog/mastering-ruby-blocks-in-less-than-5-minutes