我怎样才能在 ruby 中达到这个结果?

How can I achieve this result in ruby?

我正在阅读 Sequel 的文档,我对以下代码片段中使用的技术感到好奇:

class Post < Sequel::Model(:my_posts)
  (...)
end

Sequel::Model(:my_posts) 为模型设置数据库 table。我特别好奇 Model(:my_posts) 中的括号。我喜欢这个界面,但我该如何实现呢?有点奇怪。。。好像Model可以当方法调用。。。这是什么技巧?有人可以给我举个例子吗?

通常当您将 :: 与模块或 class 一起使用时,ruby 将尝试在常量中的 :: 之后查找表达式。

Example::First => as constant
Example::First() => as method

运行 这段代码:

module Example
  class << self
    def First(a)
      puts a
    end
  end

  module First
  end
end

用法:

Example::First(1) # => prints 1

当你使用 class << self 时,你打开自己的 class 以便可以为当前的自己对象重新定义方法(在 class 或模块主体中是 class 或模块本身)。在 SO 上读得很好 question/answers

It's good practice, while not mandatory, to start the method name with a lower-case character, because names that start with capital letters are constants in Ruby. It's still possible to use a constant name for a method, but you won't be able to invoke it without parentheses, because the interpeter will look-up for the name as a constant

来自What are the restrictions for method names in Ruby?