Module global variables

Is there a way to define per-module global variables? My best
approximation is the following

module Foo
@@x = 0
def do_something_on_x
@@x = …
end
def x
@@x
end
end

The drawbacks are that I haven’t found anything similar to
attr_reader/writer/… for instance variables.

If interested in the real use case here it is: I’ve defined a module
which include a set of common functionalities which need to deliver
messages with a given verbosity. I want to avoid to pass the verbosity
configuration to all the involved class and methods but I want to avoid
to use a global $verbosity variable since the setting should be limited
to all the functionalities implemented by my module.

Here is how I’m using the verbosity setting:

module Foo
@@verbosity = 0
def incr_verbosity
@@verbosity += 1
end
def verbosity
@@verbosity
end
end

I would love to write something like

module Foo
@@verbosity = 0
module_attr_reader :verbosity
def incr_verbosity
@@verbosity += 1
end
end

Am I using the wrong tool for my end?

Many thanks in advance,
Cheers.

Stefano Z. wrote:

end

to all the functionalities implemented by my module.
end
end

Am I using the wrong tool for my end?

Try a constant.

T.

On Mon, Jan 22, 2007 at 02:52:58AM +0900, Trans wrote:

Am I using the wrong tool for my end?
Try a constant.

Already tried. I can’t stand the warning and I can’t blame the compiler
for outputting it: a constant would definitely be the wrong tool :slight_smile:

On 1/21/07, Stefano Z. [email protected] wrote:

On Mon, Jan 22, 2007 at 02:52:58AM +0900, Trans wrote:

Am I using the wrong tool for my end?
Try a constant.

Already tried. I can’t stand the warning and I can’t blame the compiler
for outputting it: a constant would definitely be the wrong tool :slight_smile:

why do you need this in your module? Is it going to be mixed into
something or no?

On Mon, 2007-01-22 at 03:05 +0900, Gregory B. wrote:

something or no?

end
foo
=> 50
=> 70

d.banana
=> 80

A.bar
=> 70

Well just a stolen idea from somewhere. But why not use module instance
variables:

module A
@foo = “Bar”
class << self; attr_accessor :foo; end
end

p A.foo

PS : Sometimes I really need to think hard to differentiate between a
class and a module.

On 1/21/07, Gregory B. [email protected] wrote:

On 1/21/07, Stefano Z. [email protected] wrote:

On Mon, Jan 22, 2007 at 02:52:58AM +0900, Trans wrote:

Am I using the wrong tool for my end?
Try a constant.

Already tried. I can’t stand the warning and I can’t blame the compiler
for outputting it: a constant would definitely be the wrong tool :slight_smile:

why do you need this in your module? Is it going to be mixed into
something or no?

Something like this might work:

end
end
=> nil
A.bar = 20
=> 20
class B
include A
def apple
foo
end
end
=> nil
c = B.new
=> #<B:0x31485c>
c.apple
=> 30
c.apple
=> 40
c.apple
=> 50
class C
include A
def banana
foo + 10
end
end
=> nil
d = C.new
=> #<C:0x1cc1b4>
d.banana
=> 70
d.banana
=> 80
A.bar
=> 70

On 1/21/07, Hemant K. [email protected] wrote:

module A
@foo = “Bar”
class << self; attr_accessor :foo; end
end

p A.foo

That’s probably the same effect, and a little shorter, too.

PS : Sometimes I really need to think hard to differentiate between a
class and a module.

Maybe you’d find this post interesting: O'Reilly Media - Technology and Business Training
Not exactly the same topic, but related

On Mon, 2007-01-22 at 04:21 +0900, Gregory B. wrote:

And i missed that, you will have to use self.class.foo to access the
module instance variable from instance methods.

PS : Sometimes I really need to think hard to differentiate between a
class and a module.

Maybe you’d find this post interesting: O'Reilly Media - Technology and Business Training
Not exactly the same topic, but related

PS: hmm thanks.

On Mon, Jan 22, 2007 at 03:00:09AM +0900, Gregory B. wrote:

why do you need this in your module? Is it going to be mixed into
something or no?

Actually no. It’s just the “namespace” in which I’m implementing various
classes.

I can alternatively write a class pertaining to this namespace and use a
class variable of that class, but since the class would be otherwise
pointless I thought a module variable would have been a better solution

Cheers.

On Mon, Jan 22, 2007 at 04:08:38AM +0900, Hemant K. wrote:

Well just a stolen idea from somewhere. But why not use module instance
variables:

Thanks (to you and Gregor), that’s precisely what I was looking for!

I also found the same example in the pickaxe book (in which sometime
it’s difficult to find what you were looking for from the index …),
and now I’ve a clearer understanding of its meaning.

Cheers.

On Mon, Jan 22, 2007 at 10:07:54AM +0900, Mike K. wrote:

I also found the same example in the pickaxe book (in which sometime
it’s difficult to find what you were looking for from the index …),
and now I’ve a clearer understanding of its meaning.
Where is this discussed in pickaxe (which page number)?

Page 374.

Note that the discussed topic is not “module instance variables”, but
rather the class << self trick for associating a class with the self
object (which in the pickaxe case is a class object). AFAIU the same is
done in the solution proposed to me, but with a module object instead of
a class object.

Correct me if my understanding is wrong.

Cheers.

On Mon, Jan 22, 2007 at 08:29:24AM +0900, Stefano Z. wrote:

I also found the same example in the pickaxe book (in which sometime
it’s difficult to find what you were looking for from the index …),
and now I’ve a clearer understanding of its meaning.

Where is this discussed in pickaxe (which page number)?

I ran into basically the same issue a few weeks ago and came up with the
same solution. I read the pickaxe cover to cover (a long time ago) and
I couldn’t remember seeing that particular example. On the other hand,
much of what I read I’m forgetting.

On Mon, Jan 22, 2007 at 05:11:49PM +0900, Stefano Z. wrote:

Where is this discussed in pickaxe (which page number)?

Page 374.

Hmm, must be first edition, although you gave me a clue where to look
for it. In the second edition, it’s under “Class Instance Variables” in
Chapter 24: Classes and Objects, page 388.

Yeah, I guess I just don’t recall reading that the first time.

Thanks.

On Tue, 23 Jan 2007 14:05:59 +0900, Mike K. wrote:

On Mon, Jan 22, 2007 at 05:11:49PM +0900, Stefano Z. wrote:

Where is this discussed in pickaxe (which page number)?
Page 374.
Hmm, must be first edition, although you gave me a clue where to look
for it. In the second edition, it’s under “Class Instance Variables” in
Chapter 24: Classes and Objects, page 388.

Uhm my fault. It’s actually the second edition, but indeed I wanted to
point to the page you’re mentioning. I probably screwed up the page
numbers between the “paper” page numbers and the pdf page numbers I was
looking at. Or something similar, since right now even the pdf page
number does not much … But it’s cool, we both found what we were
looking for :slight_smile:

Cheers.