定义类实例的默认访问器

时间:2018-07-24 23:28:59

标签: ruby

是否可以为我的类的实例定义默认访问器?

我有一堂课

class Foo
    def initialize(a, b)
        @a = a
        @b = b
    end
end

我想创建此类的新实例:

foo = Foo.new(:a, :b)
# => #<Foo:0x00007f9e04c7b240 @a=:a, @b=:b>

创建一个新数组将返回一个真实值:

arr = Array.new(2, :bar)
# => [:bar, :bar]

如何设置我自己的类实例的默认访问器,以便在我调用foo时获得真实值而不是#<Foo:0x00007f9e04c7b240 @a=:a, @b=:b>

1 个答案:

答案 0 :(得分:2)

当您在IRB控制台上看到输出时,它所做的就是在对象上调用inspect。因此,您所需要做的就是(像数组一样),为您的自定义对象定义一个inspect方法:

class Foo
  def initialize(a, b)
    @a = a
    @b = b
  end

  def inspect
    %["Real value" for Foo with #{@a} and #{@b}]
  end
end
foo = Foo.new(:a, :b) # => "Real value" for Foo with a and b

默认情况下,您看到的只是Object#inspect的实现,因此,如果您确实愿意,可以对所有对象(没有自定义实现)覆盖它:

class Object
  def inspect
    "Custom Inspection of #{self.class.name}"
  end
end

# Foo2 is the same as Foo just without the `inspect` method)
foo_2 = Foo2.new(:a, :b) # => Custom Inspection of Foo2

不过,我会避免为Object#inspect进行此操作,因为人们已经习惯并期望看到默认格式,并且更改某些内容可能会使它们无法正常运行。