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

问题描述:

我知道我失去了一些东西简单,但在这里,导轨导向表明,可以出现在session_store.rb下面的示例配置:什么是看起来像方法调用的ruby/rails语法?

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

它看起来像一个方法的调用:session_store与ARGS。然而session_store似乎实际上是ActionDispatch::Session::ActiveRecordStore的一个实例。

那么,这里究竟发生了什么?

+2

它是一个方法调用,'ActionDispatch :: Session :: ActiveRecordStore'是方法的返回值。 – Stefan

+0

谢谢。我似乎无法找到Rails :: Application :: Configuration或其父母记录的此方法。它应该是?我尝试了'Rails.application.config.session_store.source_location'来试图确定它的定义。 – Noob123

+0

尝试'Rails.application.config.method(:session_store).source_location',它应该指向[.../gems/railties-4.2.6/lib/rails/application/configuration.rb:163](https: //github.com/rails/rails/blob/v4.2.6/railties/lib/rails/application/configuration.rb#L163) – Stefan

当执行

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