Beim Lesen des Ruby-Codes
Manchmal benutze ich einen Debugger.
Es war jedoch selten, dass ich in eine Methode einsteigen wollte, aber die Beschreibung, die ich für ein Argument dieser Methode hielt, war tatsächlich ein anderer Methodenaufruf, und ich konnte den Aufrufbaum nicht verstehen.
Zu diesem Zeitpunkt wächst source_location in class Method
Ich kam schließlich auf die Idee, die Methode anzuwenden, also notieren Sie sie sich.
Ein Beispiel für die Untersuchung der Ursache eines Versuchs, den in ActiveSupport :: Cache :: RedisCacheStore
verwendeten Redis-Client durch einen Mock zu ersetzen, wenn rspec ausgeführt wird, aber die Methode with
fehlt.
Zeile 345 wird mit redis.with method_missing. Wenn man sich das Redis-Juwel ansieht, scheint es, dass "mit" nicht definiert ist. I frage mich, was.
From: /bundle/gems/activesupport-6.0.3.2/lib/active_support/cache/redis_cache_store.rb:344 ActiveSupport::Cache::Strategy::LocalCache#read_entry:
339: # Store provider interface:
340: # Read an entry from the cache.
341: def read_entry(key, **options)
342: failsafe :read_entry do
343: binding.pry
=> 344: raw = options&.fetch(:raw, false)
345: deserialize_entry(redis.with { |c| c.get(key) }, raw: raw)
346: end
347: end
348:
349: def read_multi_entries(names, **options)
Beenden Sie das Ersetzen des Modells, führen Sie es erneut aus und versuchen Sie, die Quelle anzuzeigen.
[1] pry(#<ActiveSupport::Cache::RedisCacheStore>)> redis.method(:with).source
=> " def with\n yield self\n end\n"
Was ist diese Methode?
In einem solchen Fall source_location
!
[2] pry(#<ActiveSupport::Cache::RedisCacheStore>)> redis.method(:with).source_location
=> ["/bundle/gems/activesupport-6.0.3.2/lib/active_support/cache/redis_cache_store.rb", 24]
Ist es hier? https://github.com/rails/rails/blob/fbe2433be6e052a1acac63c7faf287c52ed3c5ba/activesupport/lib/active_support/cache/redis_cache_store.rb#L24-L26
Ist es einfach zu bedienen, indem Sie "ConnectionPoolLike" einfügen und einen Patch auf "Redis" anwenden? Ich frage mich, ob ich "ConnectionPoolLike" in den Redis-Client aufnehmen muss, der mit einem Mock verbunden ist. Wenn sich die Implementierung von ActiveSupport ändert, frage ich mich, ob ich sie ordnungsgemäß befolgen kann.
Mögen.
Q
Wenn Klassen an verschiedenen Orten geöffnet werden und das Verhalten geändert werden kann, kann es schwierig sein, dies nur durch Lesen der Quelle zu bemerken. Fertig.
Recommended Posts