Ruby/IRB:将实例变量设置为私有还是不可见?
在Ruby中,当我执行以下操作时:Ruby/IRB:将实例变量设置为私有还是不可见?,ruby,object,private,instance-variables,irb,Ruby,Object,Private,Instance Variables,Irb,在Ruby中,当我执行以下操作时: class Foo ... def initialize( var ) @var = var end ... end 然后,如果我在控制台中返回一个foo,我将得到以下对象表示: #<Foo:0x12345678910234 @var=...........> # 有时我有一个实例变量,它是一个长的散列或其他东西,这使得读取对象的其余部分变得更加困难 我的问题是:是否有办法将对象中的实例变量设置为“private”或不
class Foo
...
def initialize( var )
@var = var
end
...
end
然后,如果我在控制台中返回一个foo
,我将得到以下对象表示:
#<Foo:0x12345678910234 @var=...........>
#
有时我有一个实例变量,它是一个长的散列或其他东西,这使得读取对象的其余部分变得更加困难
我的问题是:是否有办法将对象中的实例变量设置为“private”或不可见,以便在控制台中返回该对象时不会将其作为对象表示的一部分打印出来
谢谢 快速搜索之后,我认为Ruby不支持私有实例变量。最好的方法是重写对象的
to_s
方法(或monkey patch对象#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
class-Foo
黑名单=[:@private]
def初始化(公用、专用)
@公共的
@私人的
结束
def至美国
public_vars=self.instance_variables.reject{| var|
黑名单。包括?变量
}.map{| var|
“{var}=\”{instance\u variable\u get(var)}\”
}.join(“”)
""
结束
结束
请注意,它们仍然可以通过
obj.instance\u variables
和obj.instance\u variable\u get
访问,但至少它们不会妨碍您的调试。这很有意义,对于我正在进行的工作,将重写为\u
将是一个非常简单的修复方法。我想我从来没有真正想过返回对象的控制台输出只是从to\s
方法中获取的!