我正在使用 Sinatra但我是 Ruby 的新手,对下面的代码实际上在做什么感到困惑。
class Something < Sinatra::Base
get '/' do
'hello world'
end
end
我们似乎没有定义方法。我们是在调用 get
方法吗?如果是这样,它是在什么时间调用的?我还没有在其他语言中看到过这样的内容。
如果我们有两个扩展 Sinatra::Base 的类,Sinatra 如何理解 get
应用于 Something
而不是其他类。
最佳答案
与 Java 函数等方式相反,当您在 Ruby 中定义类时,Ruby 实际上是在执行代码。有点像 Java 的静态 block 。所以当你这样做时,例如
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 请求时要做的事情”的表格。它记得当它看到 URL /
时,它应该执行 block 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 并执行它在那里找到的内容。
关于ruby - 这个 ruby "method"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25479515/