gpt4 book ai didi

ruby - 我可以在没有 &block 的情况下访问 ruby​​ block 的源代码吗?

转载 作者:行者123 更新时间:2023-12-04 00:59:22 25 4
gpt4 key购买 nike

我在 Ruby 2.5 下使用 Pry 来调试基类 (Net::HTTP) 中的问题

我收到由 HTTP 404 响应引起的异常,我想检查发出的请求的正文。为此,我想检查传递给 start 的 block ,但是 start 方法没有参数,它是使用 yield 调用的:

Frame type: method

From: /usr/share/ruby/net/http.rb @ line 910 Net::HTTP#start:

905: def start # :yield: http
906: raise IOError, 'HTTP session already opened' if @started
907: if block_given?
908: begin
909: do_start
=> 910: return yield(self)

使用 Pry如果该 block 未在 &block 参数中传递,有什么方法可以查看该 block 的来源?

Printing the source code of a Ruby block但这对我没有帮助,因为我在这里没有要使用的方法参数。

最佳答案

TL;DR 您可以尝试利用 Kernel#caller .


让我们考虑一个名为 foo.rb 的文件:

(本例使用的是byebug,但是与binging.pry的流程几乎是一样的)

1: require 'byebug'
2:
3: def bar
4: byebug
5:
6: yield
7: end
8:
9: bar { 'some string' }

当我们用 ruby foo.rb 运行这个文件时,我们将在 byebug 语句处停止。

[1, 9] in foo.rb
1: require 'byebug'
2:
3: def bar
4: byebug
5:
=> 6: yield
7: end
8:
9: bar { 'some string' }

然后我们可以执行caller,然后会打印类似下面的内容:

(输出有意减少和格式化)

(byebug) caller
[
"~/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/byebug-11.0.1/lib/byebug/processors/command_processor.rb:97:in `process_commands'",
"~/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/byebug-11.0.1/lib/byebug/processors/command_processor.rb:55:in `at_line'",
"~/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/byebug-11.0.1/lib/byebug/context.rb:98:in `at_line'",
"foo.rb:6:in `bar'",
"foo.rb:9:in `<main>'"
]

如您所见,caller 将当前执行堆栈作为一个数组返回,该数组包含 `method' 中 file:line 形式的字符串。

此数组中的最后一个字符串指定调用 bar 的位置。

了解此信息后,您可以使用 bar 调用打开文件并跟踪哪个 block 被传递到其中。

(foo.rb:9 在这种特殊情况下)

希望对您有所帮助。

作为奖励,Tenderlove 发表了一篇精彩的文章- I am a puts debugger ,您可以在其中找到可能针对每个 Ruby 调试问题的解决方案。

关于ruby - 我可以在没有 &block 的情况下访问 ruby​​ block 的源代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59883642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com