这个看起来像方法调用的 ruby/rails 语法是什么



我知道我在这里缺少一些简单的东西,但是,rails指南显示了以下可以出现在session_store.rb中的示例配置:

  Rails.application.config.session_store :cookie_store, key: '_your_app_session', domain: ".example.com"

这看起来像是对方法的调用:session_store 与参数。 然而session_store这里似乎实际上是ActionDispatch::Session::ActiveRecordStore的一个实例。

那么,这里到底发生了什么?

执行时

Rails.application.config.session_store
#=> ActionDispatch::Session::ActiveRecordStore

您正在调用 session_store 方法。 ActionDispatch::Session::ActiveRecordStore是方法的返回值,而不是方法本身。由于ActiveRecordStore是一个类,它不会响应source_location

Rails.application.config.session_store.source_location
#=> NoMethodError: undefined method `source_location' for ActionDispatch::Session::CookieStore:Class

在 JavaScript(和其他语言)中,可以通过其名称引用函数,并通过附加括号来调用:

function foo() {
  return 123;
}
foo           // function() { return 123; }
typeof foo    // "function"
foo()         // 123
typeof foo()  // "number"

但是,在 Ruby 中,调用方法时括号是可选的,foofoo()调用该方法:

def foo
  123
end
foo           #=> 123
foo.class     #=> "fixnum"
foo()         #=> 123
foo().class   #=> "fixnum"

若要获取给定方法名称的Method对象,必须在其接收器上调用 method 方法:

method(:foo) #=> #<Method: Object#foo>

在您的情况下:

Rails.application.config.method(:session_store)
#=> #<Method: Rails::Application::Configuration#session_store>
Rails.application.config.method(:session_store).source_location
#=> [".../gems/railties-4.2.6/lib/rails/application/configuration.rb", 163]

以下是源代码:railties/lib/rails/application/configuration.rb:163

最新更新