
Issue #20987 has been updated by mame (Yusuke Endoh). Basically, I like this proposal. I use `Kernel#p` and `pp` a lot when debugging. I often include an identifier such as `p [:foo, obj]`, `p [:bar, obj]` to distinguish which `p` the output is from. If the debug output method itself prints the caller filename, this identifier might be unnecessary. (But TBH, I am not sure. The filename and line number could be insufficient for easy recognition.) Also, I delete all calls to `p` after debugging is done, but it is sometimes difficult to find all `p` calls. If `p` would output the filename, the deletion process would be definitely easy. I think it would be better to extend `p` instead of introducing `dbg`. Three letters are too long for every debug method call. As for a concern, it may be troublesome for `p` to always print the filename. Just an idea, how about opt-in by an environment variable? ``` $ ruby foo.rb "Hello world". $ P=1 ruby foo.rb [foo.rb:1] "Hello world" ``` ---------------------------------------- Feature #20987: Add dbg - minimal debugging helper https://bugs.ruby-lang.org/issues/20987#change-111210 * Author: pawurb (Pawel Urbanek) * Status: Open ---------------------------------------- Hi. It's my first time contributing here, so I'm sorry in advance if I've mixed something up. I’m author of https://github.com/pawurb/dbg-rb gem. `dbg` method is inspired by Rust where it's built-in into std-lib (https://doc.rust-lang.org/std/macro.dbg.html). AFAIK in Ruby there's no simple mechanism to puts debug values together with caller info without using external dependencies. What’s more frustrating is that while `p nil` outputs `nil` to the std, `puts nil` prints a blank line, sometimes making debugging sessions confusing. I would like to propose adding a minimal `dbg` helper method to stdlib: ``` dbg("Hello world", [1, 2, 3]) # => [dir/file.rb:12] "Hello world" # => [dir/file.rb:12] [1, 2, 3] ``` `dbg` will produce verbose output together with informative file name and LOC info. I think that such built-in feature would be useful for many Ruby devs. My gem uses external dependencies, but I've came up with this barebones implementation: ``` def dbg(*msgs) loc = caller_locations.first.to_s matching_loc = loc.match(/.+(rb)\:\d+\:(in)\s/) src = if matching_loc.nil? loc else matching_loc[0][0..-5] end file, line = src.split(":") file = file.split("/").last(2).join("/") src = "[#{file}:#{line}]" msgs.each do |msg| puts "#{src} #{msg.inspect}" end nil end ``` ---Files-------------------------------- Screenshot 2024-12-27 at 00.00.23.png (81.5 KB) -- https://bugs.ruby-lang.org/