
Issue #20987 has been updated by pawurb (Pawel Urbanek). Thanks for feedback! One thing I'm worried about with `P=1` approach, are Ruby programs that rely on the current `p` output, making it impossible to opt-in this new feature. Maybe we could go for `d` instead of `dbg`? As for identifiers, [dbg-rb gem](https://github.com/pawurb/dbg-rb) currently supports passing local variables via symbols like this: ```ruby a = 1 b = 2 dbg(:a, :b) # [models/user.rb:22] a = 1 # [models/user.rb:22] b = 2 ``` This feature requires [binding_of_caller](https://github.com/banister/binding_of_caller) gem, but if it was found useful enough, maybe it could be possible to reimplement it without external deps? Optional identifiers together with file name and LOC info would make Ruby debugging much simpler. ---------------------------------------- Feature #20987: Add dbg - minimal debugging helper https://bugs.ruby-lang.org/issues/20987#change-111211 * 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/