ruby - 这个 ruby "method"是如何工作的?

标签 ruby class object methods sinatra

我正在使用 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/

相关文章:

ruby - Ruby 中数组和哈希的性能

php - Cron 是运行计划任务的唯一方法吗?

java - class.getResource (".") 返回 null

c++ - 如何正确使用一个头文件成为一个完整的类?

java - 如何在 Java 中循环访问对象值

php - MySQL RENAME TABLE 语句如何工作/执行?

Ruby 按列对 .dat 文件进行排序

java - 如何在 JComboBox 中正确渲染我自己的类?

javascript - foreach 循环中的函数?

java - 如何修复该类的 addToCart 方法?