gpt4 book ai didi

ruby-on-rails-3 - 这个 Rails 引擎代码是什么意思 : config. to_prepare &method( :activate). to_proc

转载 作者:行者123 更新时间:2023-12-04 02:33:03 26 4
gpt4 key购买 nike

我正在使用广泛使用 Rails 引擎的 Spree。我发现的一个常见模式是这样的。但是我无法理解这段代码。

class Engine < Rails::Engine 
def self.activate
...
end

config.to_prepare &method(:activate).to_proc
end
  • 什么.to_prepare
  • &method 有什么用运营商做什么?
  • 代码的整体效果如何?

  • 非常感谢!

    最佳答案

    &method(:activate).to_proc

    最好一次食用一件。 (应该注意,这部分代码是 100% 非 Rails 特定的 Ruby。)
    method是一个 Ruby 方法(都是非常元的)。它is documented thusly :

    Looks up the named method as a receiver in obj, returning a Method object (or raising NameError). The Method object acts as a closure in obj’s object instance, so instance variables and the value of self remain available.



    查看以下 IRB session :
    ruby-1.9.2-p136 :001 > def my_method
    ruby-1.9.2-p136 :002?> puts "in my_method"
    ruby-1.9.2-p136 :003?> 10
    ruby-1.9.2-p136 :004?> end
    => nil
    ruby-1.9.2-p136 :005 > method(:my_method)
    => #<Method: Object#my_method>

    所以 method调用正在查找(在您的示例中) activate方法并创建 Method object为了它。 Method包含一个名为 to_proc 的方法,其中“ returns a Proc object corresponding to this method”。继续我们的 IRB session :
    ruby-1.9.2-p136 :006 > method(:my_method).to_proc
    => #<Proc:0x000001010a3e38 (lambda)>

    最后,我们使用与号运算符,当它位于 Proc 之前时对象在方法调用期间,将被块 Proc 替换包含。再一次在 IRB:
    ruby-1.9.2-p136 :007 > def executor(&block)
    ruby-1.9.2-p136 :008?> block.call
    ruby-1.9.2-p136 :009?> end
    => nil
    ruby-1.9.2-p136 :010 > executor( &method(:my_method).to_proc )
    in my_method
    => 10

    因此,在伪代码中,您列出的行是说:
    config.to_prepare(a block containing the functionality of the method activate)

    config.to_prepare

    [根据 schof 的评论编辑]
    config.to_prepare需要一个应该运行的块来设置你的 Railtie/引擎。它在生产模式下和开发中的每个请求上运行一次,并且是唯一保证在开发模式下对每个请求都调用的代码。如果您正在修改类( class_eval 等)作为引擎初始化的一部分,这一点很重要;否则,您将在开发与生产中看到不同的行为。

    但为什么?

    这是一个常见习语的原因是,您不必在 to_prepare 中定义准备代码。阻止本身;您可以在类中定义方法,然后使用上述魔法将它们转换为块(记住其作用域)。该代码在功能上等效于:
    class Engine < Rails::Engine 
    config.to_prepare do
    (the contents of self.activate)
    end
    end

    关于ruby-on-rails-3 - 这个 Rails 引擎代码是什么意思 : config. to_prepare &method( :activate). to_proc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5103860/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com