从覆盖范围中包含的关注点调用覆盖范围

时间:2019-06-30 10:30:02

标签: ruby-on-rails ruby

因此,基本上,我有一个MyClass类,该类包含关注MyConcern和一个包含范围'foo'。我希望能够在MyClass中覆盖范围'foo',但仍然能够在MyConcern中调用覆盖范围。

for index in settings.guessArray {
            wait(time: 2.0) {
                settings.alphas[index] = 1.0
                wait(time: 0.3) {
                    settings.alphas[index] = 0.5
                }
            }
        }

因此,当我调用module MyConcern { extend ActiveSupport::Concern included do scope :foo, lambda{ |x| puts "Hello" } end } class MyClass { include MyConcern scope :foo, lambda{ |x| MyConcern.foo(x) puts " World" } } 时,其中@myClass.foo(1)是MyClass的一个实例时,我应该能够看到打印出的“ Hello World”。

我可以找到一个类似的线程是Calling super in overriden scope defined in concern,但不幸的是我无法使用常规的类方法。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

在MyConcern中使用include时,会在类上调用“ include YourModule”后发生。 但不会改变MyConcern上的任何内容。如果您想拥有超类方法,请尝试

module MyConcern
  extend ActiveSupport::Concern
  def self.foo
    puts "Hello"
  end
end

Now you can call MyConcern.foo

答案 1 :(得分:0)

一个关注点是避免在类之间重复和共享方法。因此,您无需调用Module即可调用包含在类中的方法。同样,如果您在类中重新定义关注的方法,则它将覆盖关注的方法。这与我认为您要尝试的操作更接近,但是请注意,您需要在类中使用新的方法名称。

module MyConcern
  extend ActiveSupport::Concern

  included do
    def self.foo # don't pass unused arguments so x is removed here
      puts "Hello"
    end
  end

end

然后在您的课程中:

 class MyClass 
  include MyConcern

  # don't define foo but a new method name    
  def self.fool(x)
    foo
    puts "#{x} World"
  end

end

现在您可以致电:

MyClass.fool('bar')

还请注意,您的特定示例对于范围方法没有用,而是仅定义类方法,如我在此处所示。