irb(main):001:0>
irb(main):002:0* class A
irb(main):003:1> def secret;"you found me";end
irb(main):004:1> end
=> nil
irb(main):005:0> class BlackHole
irb(main):006:1> a=A.new
irb(main):007:1> end
=> #<A:0x40224e50>
irb(main):008:0> ObjectSpace.each_object(){|obj| $found=obj if obj.respond_to? :secret }
=> 5252
irb(main):009:0> $found
=> #<A:0x40224e50>
irb(main):010:0> $found.secret
=> "you found me"
irb(main):011:0>
seemingly a is not dead inside BlackHole
is there a civilized way to get to it? (not through ObjectSpace)
I know Ruby has @@ and @ for variables, everything else are methods
if defined inside a class like in example above
but where do object like a go if defined inside a class?
irb(main):001:0>
irb(main):002:0* class A
irb(main):003:1> def secret;"you found me";end
irb(main):004:1> end
=> nil
irb(main):005:0> class BlackHole
irb(main):006:1> a=A.new
irb(main):007:1> end
=> #<A:0x40224e50>
irb(main):008:0> ObjectSpace.each_object(){|obj| $found=obj if obj.respond_to? :secret }
=> 5252
irb(main):009:0> $found
=> #<A:0x40224e50>
irb(main):010:0> $found.secret
=> "you found me"
irb(main):011:0>
seemingly a is not dead inside BlackHole
is there a civilized way to get to it? (not through ObjectSpace)
I know Ruby has @@ and @ for variables, everything else are methods
if defined inside a class like in example above
but where do object like a go if defined inside a class?
Regards, Daniel
It's a local variable that goes out of scope when the class body is closed. The fact that you can access it via ObjectSpace does not proove much. The instance is likely not yet garbage collected when you start ObjectSpace.each_object. Also note, that it's dangerous to rely on IRB when it comes to local variables and such as IRB behaves slightly different than the Ruby interpreter due to the line by line mode.
It's a local variable that goes out of scope when the class body is closed. The fact that you can access it via ObjectSpace does not proove much. The instance is likely not yet garbage collected when you start ObjectSpace.each_object. Also note, that it's dangerous to rely on IRB when it comes to local variables and such as IRB behaves slightly different than the Ruby interpreter due to the line by line mode.
First I thought the same. But running the following (even without IRB) still finds the object:
class A
def secret;"you found me";end
end
class BlackHole
A.new
nil
end
GC.start
ObjectSpace.each_object(){|obj| $found=obj if obj.respond_to? :secret }
p $found # => #<A:0xb7b1af74>
p $found.secret # => "you found me"
v = [ RUBY_PLATFORM, RUBY_VERSION, RUBY_RELEASE_DATE ] * ' '
p v # => "i686-linux 1.8.4 2005-12-24"
It's a local variable that goes out of scope when the class body is closed. The fact that you can access it via ObjectSpace does not proove much. The instance is likely not yet garbage collected when you start ObjectSpace.each_object.
ok, I understand. They are used in the same way as any local variable.
right now I don't see any possible not trivial purposes it could be useful for me. Maybe something like
class Q
f=File.read("data")
eval f
end
By the way, what if I create
class Q
@x=1
end
to whom does @x belong now?
Does it make sense? (Usually one wants to create with @@ class variables at this scope)
to whom does @x belong now?
Does it make sense? (Usually one wants to create with @@ class variables at this scope)
I actually have no memory of ever having wanted to use a class
variable in Ruby But anyway... see Florian's answer; but I just
wanted to add, as a general rule:
Whenever you see @var, you are seeing an instance variable that
belongs to whatever object, at that point in execution, is "self". Thus the answer to "What object does @var belong to?" is always the
same: self.
So at the top level of a class definition, where self is the class
object, @var will belong to the class object.
Ah, I see. If this happens in a required file, it's garbage collected after the file has been evaluated. One should keep this in mind, after creating larger objects in "class .. end".