Я наконец нашел решение, которое работает, и теперь я добавил весь исполняемый код.Просто сохраните код, например, в файле callexample.rb
и назовите его ruby callexample.rb
. Основное отличие моего решения вопроса состоит в том, что вызов on_message
теперь создает экземпляр с соответствующими аргументами и регистрами.созданный экземпляр.Поэтому я удалил метод inherited
, потому что он мне больше не нужен.
Я добавил несколько операторов puts
, чтобы продемонстрировать, в каком порядке работает код.
class MainAppModule ## Added class
@@registered_extensions = []
def self.registered_extensions; @@registered_extensions; end
end
class ExtensionBase
attr_reader :regex
def self.on_message(string, &block)
MainAppModule.registered_extensions << self.new(string, block)
end
def initialize(string, block)
@regex = Regexp.new(string)
@on_message_callback = block
end
def exec(message)
args = @regex.match(message).captures
@on_message_callback.call(args)
end
end
class MyExtension < ExtensionBase
on_message '/join (.+)' do |username|
# this will be a callback function used later
puts "Callback of #{self} called."
"returnvalue"
end
end
# somewhere else in the code, I find the class that I need...
MainAppModule.registered_extensions.each do |child|
puts "Value of regex: #{child.regex}" # this is no more nil
message = '/join something'
if message =~ child.regex
puts "On match evalue 'child.exec(message)' to: #{child.exec(message)}"
end
end