Вызов переопределенной области из включенной в переопределенную область задачи - PullRequest
2 голосов
/ 30 июня 2019

Итак, в основном у меня есть класс MyClass, который включает в себя концерн MyConcern с включенной областью действия 'foo'. Я хочу иметь возможность переопределить область 'foo' в MyClass, но все еще иметь возможность вызывать переопределенную область в MyConcern.

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 - это экземпляр MyClass, я должен увидеть распечатанный «Hello World».

Похожий поток, который я смог найти, был Вызов super в переопределенной области, определенной для проблемы , но, к сожалению, я не могу использовать обычные методы класса в моем случае.

Любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Когда вы используете включена в MyConcern, это происходит после вызова «include YourModule» для класса. Но ничего не меняет на MyConcern. Если вы хотите использовать метод суперкласса, попробуйте

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

Now you can call MyConcern.foo

0 голосов
/ 30 июня 2019

Задача состоит в том, чтобы избежать дублирования и обмениваться методами между классами.Поэтому вам не нужно вызывать модуль для вызова включенного метода, который вы включили в класс.Кроме того, если вы переопределите метод концерна в классе, он переопределит метод концерна.Вот ближе к тому, что, я думаю, вы пытаетесь сделать, но учтите, что вам нужно новое имя метода в классе.

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')

Также обратите внимание, что ваш конкретный пример бесполезен для методов области, вместо этого просто определите методы класса, как я показал здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...