Ruby “这红宝石是怎么做的?”;方法“;工作

Ruby “这红宝石是怎么做的?”;方法“;工作,ruby,class,object,methods,sinatra,Ruby,Class,Object,Methods,Sinatra,我正在使用Ruby,但我对Ruby完全陌生,并且对下面的代码实际上在做什么感到困惑 class Something < Sinatra::Base get '/' do 'hello world' end end class某物

我正在使用Ruby,但我对Ruby完全陌生,并且对下面的代码实际上在做什么感到困惑

class Something < Sinatra::Base

   get '/' do
      'hello world'
   end

end
class某物
我们似乎没有定义一种方法。我们正在调用
get
方法吗?如果是的话,什么时候叫?我在其他语言中没有见过这样的东西


如果我们有两个扩展了Sinatra::Base的类,那么Sinatra如何理解
get
应用于
Something
而不是另一个类

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

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

get
是在
Sinatra::Base
上定义的方法。因此,您的代码实际上被解释为

class Something < Sinatra::Base
  self.get('/') do
    'hello world'
  end
end
Sinatra运行时只是一个循环,当GET请求传入时,它会根据GET上的
THINGS\u TO\u DO\u查找URL,并执行在那里找到的内容

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