这个红宝石"方法"工作?

时间:2014-08-25 05:30:47

标签: ruby class object methods sinatra

我正在使用Sinatra,但我对Ruby完全不熟悉并且对以下代码的实际操作感到困惑。

class Something < Sinatra::Base

   get '/' do
      'hello world'
   end

end

我们似乎没有定义一种方法。我们是在调用get方法吗?如果是这样,它什么时候被称为?我在其他语言中看不到这样的事情。

如果我们有2个扩展Sinatra :: Base的类,那么Sinatra如何理解get适用于Something而不是其他类。

1 个答案:

答案 0 :(得分:10)

与Java函数相反,当你在Ruby中定义类时,Ruby实际上是在执行代码。有点像Java的静态块。所以当你这样做的时候。

class Foo
  puts(self)
end

您将打开一个类(即将当前self更改为Foo),在其上下文中执行puts(将打印出Foo类对象) ,然后关闭该类(将self返回到之前的状态)。

getSinatra::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并执行它在那里找到的内容。