是否可以为我的类的实例定义默认访问器?
我有一堂课
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>
?
答案 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
进行此操作,因为人们已经习惯并期望看到默认格式,并且更改某些内容可能会使它们无法正常运行。