当你想要知道方法在binding.pry中的源代码位置时,可以执行以下操作

开头

当我阅读Ruby代码时

    • implicitな部分についての知識が足りなさすぎる

 

    複雑すぎてよくわからない

当使用调试器的时候。

然而,有时候我想要进入方法中观察,但实际上以为是该方法的参数的描述,实际上却是另外一个方法调用,导致调用树变得混乱不清,这种情况偶尔会发生。

在这种情况下,我终于想到可以使用类 Method 中已有的 source_location 方法,所以我把它记下来。

打碎

尝试在rspec执行时替换ActiveSupport::Cache::RedisCacheStore中使用的redis客户端为模拟版本时,遇到了没有with方法导致程序崩溃的问题,下面是调查过程的示例。

在第345行的redis.with方法中发生了method_missing。
即使查看了redis的gem,也没有发现定义with的地方。
不知道是什么东西。

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)

停止模拟替换,重新执行,并尝试显示源代码。

[1] pry(#<ActiveSupport::Cache::RedisCacheStore>)> redis.method(:with).source
=> "      def with\n        yield self\n      end\n"

这个方法是什么鬼。
这种情况下使用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]

这里吗?
https://github.com/rails/rails/blob/fbe2433be6e052a1acac63c7faf287c52ed3c5ba/activesupport/lib/active_support/cache/redis_cache_store.rb#L24-L26

ConnectionPoolLike をincludeしてRedisにパッチをあてることで、使い勝手を揃えているのかぁ。
モックで差し込むredis clientにも ConnectionPoolLike をincludeしないとだめかなぁ。
ActiveSupportの実装が変わったら、ちゃんと追従できるかなぁ。

みたいな。

请用中文对以下内容进行理解。

在不同的地方打开类并改变它的行为,只看源代码很容易忽略这一点,对吧?
完。

广告
将在 10 秒后关闭
bannerAds