From: shevegen@... Date: 2017-11-30T12:23:01+00:00 Subject: [ruby-core:84005] [Ruby trunk Feature#14145] Proposal: Better Method#inspect Issue #14145 has been updated by shevegen (Robert A. Heiler). I have nothing at all against better diagnostics, introspection etc... However had, in that particular case that you showed above, I would personally not want it, even though I normally am always in favour of introspection. But to each their own - I have no problem if others can use it. I should also note that my contra this is only mild, so I ultimately would not have any real big objection to it either. My proposal would be to allow this to be customized or customizable, so that ruby hackers can decide on their own what they prefer. One could use symbols to toggle the behaviour such as via: :simple :expanded Where the latter may refer to the display that you described. But I guess in most ways, it really depends on the personal preferences of the ruby hacker. A good example how to solve this is one of my favourite gems of all times, the did-you-mean gem. The toggle situation is to ... either use the gem - or to uninstall it. :) That way people can decide which variant they prefer. Anyway, I don't want to make your suggestion too complex, since it really is simple - you propose a different default display purpose, which is an ok suggestion to make. In general it would be nice if ruby could allow for more customization and fine tuning of its internal behaviour or parts; see also Martin's proposal to have unicode-related stuff be easier debuggable; see also other suggestions to make threads more easily debuggable (by default) and so on and so forth. So I guess we can say that many people would like to have more control, better messages, different messages etc... - I guess the ruby core team has some things to ponder about towards the path of ruby 3.x with all of that. :) PS: Perhaps for testing purposes, the above could be enabled via a configure switch for post ruby 2.5.x, so that people could test it, and give early feedback, and then also provide more feedback here. The reason I mention this is because ruby 2.5.x changed a few things in regards to exceptions and messages, such as underlining the error, changing the stack trace display, etc... compared to ruby 2.4.x and I think people may need some days or a few weeks to adjust to it. Even adjusting to the did-you-mean gem took me a while. :) ---------------------------------------- Feature #14145: Proposal: Better Method#inspect https://bugs.ruby-lang.org/issues/14145#change-68086 * Author: zverok (Victor Shepelev) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- The idea: When investigating (in example scripts, debugger or console) the library you are unfamiliar with, Ruby's reflection is very useful mechanism to understand "what it can": classes, modules, their constants, methods and so on. I propose to expose a bit more information Ruby has internally in `Method#inspect`: ```ruby # before: some_interesting_object.method(:foo) # => # # after: some_interesting_object.method(:foo) # => # ``` Dead-naive implementation: ```ruby class Method def signature recv = case receiver when Module "#{receiver.name}." else "#{receiver.class}#" end parameters.map.with_index { |(type, name), i| case type when :req then "#{name || "param#{i+1}"}" when :opt then "#{name || "param#{i+1}"} = " when :keyreq then "#{name || "kw#{i+1}"}:" when :key then "#{name || "kwparam#{i+1}"}: " when :rest then "*#{name || "rest"}" when :keyrest then "**#{name || "kwrest"}" end }.join(', ').prepend("#{recv}#{name}(") << ")" end def inspect "#<#{self.class.name} #{signature}>" end end ``` This works "sub-optimal" for methods implemented in C, yet pretty decently for Ruby-implemented methods: ```ruby # C method, default param names [1,2,3].method(:at) # => # # Ruby method, proper param names CGI.method(:escape) # => # Addressable::URI.method(:parse) # => # Addressable::URI.method(:join) => # # We can't extract default values, but at least we can say they are there Addressable::URI.method(:heuristic_parse) # => #)> ``` If the proposal is accepted, I am ready to implement it properly in C (for all callable objects: `Method`, `UnboundMethod`, `Proc`) -- https://bugs.ruby-lang.org/ Unsubscribe: