what is the scope of this object

S

Schüle Daniel

Hi all,

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
 
R

Robert Klemme

Schüle Daniel said:
Hi all,

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.

Kind regards

robert
 
F

Florian Frank

Robert said:
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"

Is this a bug?
 
F

Florian Frank

ts said:
F> Is this a bug?

no, for ruby it's still on the stack.
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".
 
S

Schüle Daniel

Hello,

[...]
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)

Regards, Daniel
 
F

Florian Frank

Schüle Daniel said:
class Q
@x=1
end
to whom does @x belong now?
Q.instance_variable_get :mad:x # => 1
Does it make sense? (Usually one wants to create with @@ class
variables at this scope)
@@variables are shared across the whole class hierarchy. Often that is
not what is wanted. IMHO they are rather useless.

Your @x from above is a class instance variable, a variable of the class
object Q.

It's a good idea to use accessor methods to set/get its value.

class Q
class << self
attr_accessor :x
end
self.x = 0
end

Q.x # => 0
Q.x = 1
Q.x # => 1
 
D

dblack

---2049402039-1415609092-1154303815=:13048
Content-Type: MULTIPART/MIXED; BOUNDARY="-2049402039-1415609092-1154303815=:13048"

This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---2049402039-1415609092-1154303815=:13048
Content-Type: TEXT/PLAIN; charset=X-UNKNOWN; format=flowed
Content-Transfer-Encoding: QUOTED-PRINTABLE

Hi --

By the way, what if I create

class Q
@x=3D1
end

to whom does @x belong now?
Does it make sense? (Usually one wants to create with @@ class variables = at=20
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".=20
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.


David

--=20
http://www.rubypowerandlight.com =3D> Ruby/Rails training & consultancy
----> SEE SPECIAL DEAL FOR RUBY/RAILS USERS GROUPS! <-----
http://dablog.rubypal.com =3D> D[avid ]A[. ]B[lack's][ Web]log
http://www.manning.com/black =3D> book, Ruby for Rails
http://www.rubycentral.org =3D> Ruby Central, Inc.
---2049402039-1415609092-1154303815=:13048--
---2049402039-1415609092-1154303815=:13048--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top