【问题标题】:Ruby / IRB: set instance variable to private or otherwise invisible?Ruby / IRB:将实例变量设置为私有或不可见?
【发布时间】:2011-10-08 00:06:20
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: ruby object private instance-variables irb


    【解决方案1】:

    经过快速搜索,我认为 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 访问,但至少它们不会妨碍您的调试。

    【讨论】:

    • 这很有意义,覆盖to_s 将是我正在处理的一个非常简单的修复。我想我从来没有真正想到返回对象的控制台输出只是取自 to_s 方法!
    猜你喜欢
    • 2011-01-09
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多