当你想要知道方法在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の実装が変わったら、ちゃんと追従できるかなぁ。
みたいな。
请用中文对以下内容进行理解。
在不同的地方打开类并改变它的行为,只看源代码很容易忽略这一点,对吧?
完。