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

时间:2016-06-09 22:01:23

标签: ruby-on-rails ruby

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

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

看起来像是一个方法的调用:带有args的session_store。但是session_store似乎实际上是ActionDispatch::Session::ActiveRecordStore的实例。

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

1 个答案:

答案 0 :(得分:1)

执行时

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