在Ruby中,当我做这样的事情时:
class Foo
...
def initialize( var )
@var = var
end
...
end
然后,如果我在控制台中返回foo
,我会得到这个对象表示:
#<Foo:0x12345678910234 @var=...........>
有时我有一个长哈希或其他东西的实例变量,这使得读取对象的其余部分变得更加困难。
我的问题是:有没有办法将对象中的实例变量设置为“私有”或以其他方式不可见,这样如果该对象不会将其打印为对象表示的一部分在控制台中返回?
谢谢!
答案 0 :(得分:4)
经过一些快速搜索,我认为Ruby不支持私有实例变量。最好的办法是覆盖对象的to_s
方法(或猴子补丁Object#to_s
),只输出您想要查看的实例变量。为了简化操作,您可以创建要隐藏的变量黑名单:
class Foo
BLACK_LIST = [ :@private ]
def initialize(public, private)
@public = public
@private = private
end
def to_s
public_vars = self.instance_variables.reject { |var|
BLACK_LIST.include? var
}.map { |var|
"#{var}=\"#{instance_variable_get(var)}\""
}.join(" ")
"<##{self.class}:#{self.object_id.to_s(8)} #{public_vars}>"
end
end
请注意,仍然可以通过obj.instance_variables
和obj.instance_variable_get
访问它们,但至少它们不会妨碍您的调试。