因此,基本上,我有一个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,但不幸的是我无法使用常规的类方法。
任何帮助将不胜感激!
答案 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')
还请注意,您的特定示例对于范围方法没有用,而是仅定义类方法,如我在此处所示。