Project

General

Profile

Feature #7349

Struct#inspect needs more meaningful output

Added by postmodern (Hal Brodigan) about 7 years ago. Updated almost 2 years ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[ruby-core:49328]

Description

When inheriting directly from Struct.new, Class#ancestors shows a meaningless anonymous Class:

class Point < Struct.new(:x, :y)

  def distance
    ((x ** 2) + (y ** 2)) ** 0.5
  end

end

Point.ancestors
# => [Point, #<Class:0x007fe204a1a228>, Struct, Enumerable, Object, Kernel, BasicObject]

Perhaps, the anonymous Class could list the Struct's fields?

#<Class:x, y>

History

Updated by shyouhei (Shyouhei Urabe) about 7 years ago

Sounds nice to me. +1

Updated by claytrump (Clay Trump) about 7 years ago

I like it too. Could even be:

 Point.ancestors
 # => [Point, Struct.new(:x, :y), Struct, Enumerable, Object, Kernel,

BasicObject]

--

Updated by Eregon (Benoit Daloze) about 7 years ago

It might be worth pointing out that this should not happen if the Struct generated class is assigned to a constant (and so one level of inheritance is not unused):

Point = Struct.new(:x, :y) do
def distance
Math.hypot(x,y)
end
end

#4

Updated by mame (Yusuke Endoh) almost 7 years ago

  • Tracker changed from Bug to Feature

Updated by mame (Yusuke Endoh) almost 7 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)

Updated by mame (Yusuke Endoh) almost 7 years ago

This is not a bug. This ticket has been moved to the feature tracker.

I'm not against this proposal, but I don't think that people normally check the singleton class to know Struct fields. You may want to use Struct.#members:

p Point.members #=> [:x, :y]

It is shorter than ancestors.

--
Yusuke Endoh mame@tsg.ne.jp

#7

Updated by naruse (Yui NARUSE) almost 2 years ago

  • Target version deleted (2.6)

Also available in: Atom PDF