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

Posted

技术标签:

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案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 方法!

以上是关于Ruby / IRB:将实例变量设置为私有或不可见?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:自动将实例变量设置为方法参数?

没有Rails的IRB控制台中的Figaro?

ruby klb.rb irb

Ruby 私有实例变量,有例外

有没有办法从 Ruby 中的实例调用私有类方法?

Ruby注入初始为哈希