Ruby Q's

P

Phil Cooper-king

Hi I've been doing rails for a while, which was really my first
introduction to ruby. I've found my self using ruby more and more and
keep amazing my self about how cool it is, although I've got a few
questions, or rather holes in my ruby knowledge, from rails doing a lot
of stuff for you I think.

1. What does a double colon do in terms of class inheritance. ie.
GameWindow < Gosu::Window ?

2. Why would you want to use nested classes?

3. Is it bad practice to define constance out of classes?

4. How/Can you delete instance variables or objects?
 
T

ThoML

1. What does a double colon do in terms of class inheritance. ie.
GameWindow < Gosu::Window ?

Nothing. It's a namespace thing.
2. Why would you want to use nested classes?

In order not to pollute the global namespace.
3. Is it bad practice to define constance out of classes?

It depends on whether you care about polluting the global namespace.
IMHO, yes.
4. How/Can you delete instance variables or objects?

By removing references to it (unsetting variables pointing to the
object) and letting the garbage collector do its work. I'm not sure
what you mean with "delete instance variables".

I hope the answers are about right. If not, please somebody correct
me.
 
S

Sebastian Hungerecker

Phil said:
1. What does a double colon do in terms of class inheritance.
Nothing.

ie. GameWindow < Gosu::Window ?

This means that GameWindow inherits from the class Gosu::Window, which is the
class Window in the namespace Gosu.

2. Why would you want to use nested classes?

To avoid name collision or just to group things together that belong together
or keep classes that won't be directly used by the user out of the main
namespace. Like if you have a class Card that uses the class Rank, but the
user won't ever create an instance of class Rank himself (he just will get
Rank object when he does my_card.rank), you'd nest Rank inside Card (and Card
probably inside MyGame, for the previous reasons).

3. Is it bad practice to define constance out of classes?

Not as such, but it's generally a good idea - at least for libraries that will
be used by other ruby files, to have all your stuff in a namespace to avoid
name collision as in point 2.

4. How/Can you delete instance variables

Just set them to nil or use remove_instance_variable (the former won't
actually delete the variable, but why do you need to do that anyway?)
or objects?

An objects gets GCed when it's no longer referenced by any variables.

HTH,
Sebastian
 
S

Stefano Crocco

Hi I've been doing rails for a while, which was really my first
introduction to ruby. I've found my self using ruby more and more and
keep amazing my self about how cool it is, although I've got a few
questions, or rather holes in my ruby knowledge, from rails doing a lot
of stuff for you I think.

1. What does a double colon do in terms of class inheritance. ie.
GameWindow < Gosu::Window ?

Nothing special. As always, it's used to access a constant defined in another
class or module. In your specific example, it is used to access the Window
class in the Gosu module so that the GameWindow class can inherit it. It is
exactly the same as:

window = Gosu::Window

class GameWindow < window
2. Why would you want to use nested classes?
Personally, I use nested classes when the inner class is closey coupled to the
outer and isn't meant to be used by itself(for example, it can be a helper
class used by the implementation of the outer class and which isn't useful if
used in other ways). They don't provide additional benefits, but make clearer
the programmer's intent
3. Is it bad practice to define constance out of classes?
Constants defined outside classes are top level constants, so the answer
depends on the meaning of the constant. If it is related to the application or
library as a whole, it may make sense to define it globally (for example, a
constant containing the application version). If it is specific of a class,
put it there (for example, take the constants defined in class Regexp. They
are meant to be used only in methods of that class, so it wouldn't make sense
to define it globally).
4. How/Can you delete instance variables or objects?
It depends on what you exactly mean, but I'd say the answer is no. I don't
think you can force an object to be garbage-collected, and you cant undefine
an instance variable. What you can do is to make possible for the object to be
garbage-collected by setting all variables which point to it to something else
and set an instance variable to nil.

Stefano
 
S

Stefano Crocco

and you cant undefine an instance variable.

Stefano

Sorry, I misread the documentation. You can indeed undefine an instance
variable, using the remove_instance_variable method. Since it is private,
though, if you need to call it from outside the instance, you can either use
send

obj.send :remove_instance_variable :mad:var

or make the method public

class C

public :remove_instance_variable
end

Stefano
 
P

Phil Cooper-king

Thanks guys.

the Gosu::Window thing would that be an example of nested then? as in
Gosu module Window class?

the deleting instance var object was something that I was trying to do
in regards to Gosu Game lib.
it tries to update itself 60 times a second, so if you press a key it
gets regstered by the lib several times. I was trying to create a method
that it would once the key was pressed it remained inactive for a set
time. I was using the Gosu::milliseconds for this. it seemed easier to
create a class that handled this, and I was getting worried that it
would create loads of objects that only had a short life span then
sucked up perfomance as the game continued. but if they delete them self
if there is no pointer to them that works.
 
J

J. Cooper

Phil said:
Thanks guys.

the Gosu::Window thing would that be an example of nested then? as in
Gosu module Window class?
Yes.

the deleting instance var object was something that I was trying to do
in regards to Gosu Game lib.
it tries to update itself 60 times a second, so if you press a key it
gets regstered by the lib several times. I was trying to create a method
that it would once the key was pressed it remained inactive for a set
time. I was using the Gosu::milliseconds for this. it seemed easier to
create a class that handled this, and I was getting worried that it
would create loads of objects that only had a short life span then
sucked up perfomance as the game continued. but if they delete them self
if there is no pointer to them that works.

In your key handling method, wrap the logic in something like
if not @pause_end or Gosu::milliseconds > @pause_end
# ...
end

After you handle whatever key was pressed, just add a line like:

@pause_end = Gosu::milliseconds + 500 # or however long you want it to
be inactive
 
A

Andres Colon

In regards to this post, a more relevant example of an instance variable
reference problem is the following:

In a Game Object, there is an Area object.
An area object has Player A and Player B, which are themselves objects.

When Player A interacts (such as attacks) Player B, both objects store a
reference to each other in order to interact.

So in this sense, the Game Object, Area Object and both players have
reference to player objects.

Now, if Player A quits the game, the Game Object might make the
reference to the Player A = nil.

It would be very helpful to be able to destroy the object, without
having to find all objects referencing this object to finally get Player
A to become nil.

I would appreciate help on this matter, on how to make a single object
nil and have that propagate to everything referencing it.
 
T

Tim Hunter

Andres said:
In regards to this post, a more relevant example of an instance variable
reference problem is the following:

In a Game Object, there is an Area object.
An area object has Player A and Player B, which are themselves objects.

When Player A interacts (such as attacks) Player B, both objects store a
reference to each other in order to interact.

So in this sense, the Game Object, Area Object and both players have
reference to player objects.

Now, if Player A quits the game, the Game Object might make the
reference to the Player A = nil.

It would be very helpful to be able to destroy the object, without
having to find all objects referencing this object to finally get Player
A to become nil.

I would appreciate help on this matter, on how to make a single object
nil and have that propagate to everything referencing it.

Two approaches come to mind. The first is make the Game Object
observable (see observable.rb). When it is destroyed it notifies the
objects that refer to it.

The second is to pass around an indirect reference to the Game Object.
For example, make an array that contains only the Game Objecct and give
the players a reference to the array. When the Game Object is destroyed
it sets the array element to nil. The players never refer to the game
object directly, only via the array and only after making sure it hasn't
become nil.
 

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
474,197
Messages
2,571,040
Members
47,634
Latest member
RonnyBoelk

Latest Threads

Top