Ruby / IRB:将实例变量设置为私有或不可见?

时间:2011-07-18 20:12:37

标签: ruby object private instance-variables irb

在Ruby中,当我做这样的事情时:

class Foo
  ...
  def initialize( var )
    @var = var
  end
  ...
end

然后,如果我在控制台中返回foo,我会得到这个对象表示:

#<Foo:0x12345678910234 @var=...........>

有时我有一个长哈希或其他东西的实例变量,这使得读取对象的其余部分变得更加困难。

我的问题是:有没有办法将对象中的实例变量设置为“私有”或以其他方式不可见,这样如果该对象不会将其打印为对象表示的一部分在控制台中返回?

谢谢!

1 个答案:

答案 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_variablesobj.instance_variable_get访问它们,但至少它们不会妨碍您的调试。