我正在使用Sinatra,但我对Ruby完全不熟悉并且对以下代码的实际操作感到困惑。
class Something < Sinatra::Base
get '/' do
'hello world'
end
end
我们似乎没有定义一种方法。我们是在调用get
方法吗?如果是这样,它什么时候被称为?我在其他语言中看不到这样的事情。
如果我们有2个扩展Sinatra :: Base的类,那么Sinatra如何理解get
适用于Something
而不是其他类。
答案 0 :(得分:10)
与Java函数相反,当你在Ruby中定义类时,Ruby实际上是在执行代码。有点像Java的静态块。所以当你这样做的时候。
class Foo
puts(self)
end
您将打开一个类(即将当前self
更改为Foo
),在其上下文中执行puts
(将打印出Foo
类对象) ,然后关闭该类(将self
返回到之前的状态)。
get
是Sinatra::Base
上定义的方法。因此,您的代码实际上被解释为好像是
class Something < Sinatra::Base
self.get('/') do
'hello world'
end
end
因为self
(即Foo
)继承自Sinatra::Base
,这是我们正在调用的方法 - 我们正在执行它,因为Something
类定义正在读取。
粗略地说,该方法的作用是保留“当GET请求进入时要做的事情”的表格。它记得当它看到网址/
时,它应该执行阻止do "hello world" end
;或多或少像这样(示例代码;原始版本有点复杂):
class Sinatra::Base
WHAT_TO_DO_ON_GET = {}
def self.get(url, &thing_to_do)
WHAT_TO_DO_ON_GET[url] = thing_to_do
end
end
Sinatra运行时只是一个循环,当GET请求进入时,会针对THINGS_TO_DO_ON_GET
查找URL并执行它在那里找到的内容。