Including general variables in modules

I’m trying to create different scenarios so I thought to do something
like:

file:scenarios.rb

module Scenarios
module Default
$bab=“defaultmodulevalue”
end
module DefaultHidden
$bab=“hiddenmodulevalue”
end
module DefaultSecond
$bab=“secondmodulevalue”
end
end

file:mytest.rb

require ‘scenarios.rb’
include Scenarios::Default

puts $bab


but it doesn’t matter which module I include I always have the same
respond:
“secondmodulevalue”

Any ideas for resolving this?

Thanks.

On Mar 12, 2008, at 11:49 AM, Mario R. wrote:

$bab=“hiddenmodulevalue”

Thanks.
Uh, stop using global variables?

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

But I need it. :frowning:

Rob B. wrote:

On Mar 12, 2008, at 11:49 AM, Mario R. wrote:

$bab=“hiddenmodulevalue”

Thanks.
Uh, stop using global variables?

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

On Mar 12, 2008, at 12:17 PM, Mario R. wrote:

-Rob
Do you really?

Perhaps you can describe your “need” and get a better answer, but why
not something like:

==> scenarios.rb <==
module Scenarios
module Default
def bab; “defaultmodulevalue”; end
end
module DefaultHidden
def bab; “hiddenmodulevalue”; end
end
module DefaultSecond
def bab; “secondmodulevalue”; end
end
end
END

==> these.rb <==
require ‘scenarios’
class ThisOne
include Scenarios::Default
end

class ThatOne
include Scenarios::DefaultSecond
end

puts “ThisOne has #{ThisOne.new.bab}”
puts “ThatOne has #{ThatOne.new.bab}”
END

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

so it’s impossible to do it whithout declaring a method…

On Mar 12, 2008, at 1:17 PM, Mario R. wrote:

so it’s impossible to do it whithout declaring a method…

You still haven’t defined what “it” really is. Perhaps with a better
description of what you’re hoping to accomplish you could get a better
answer or hint.

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

On Wed, Mar 12, 2008 at 10:17 AM, Mario R. [email protected] wrote:

so it’s impossible to do it whithout declaring a method…

That depends what you want, which isn’t clear. If you don’t need to
change the
values (and even if you do, since the constant-ness of Ruby constants
isn’t
enforced, though using them when you don’t want something constant is
usually bad design), you can do without methods:

file:scenarios.rb

module Scenarios
module Default
BAB =“defaultmodulevalue”
end
module DefaultHidden
BAB =“hiddenmodulevalue”
end
module DefaultSecond
BAB =“secondmodulevalue”
end
end

file:mytest.rb

require ‘scenarios.rb’
include Scenarios::Default

puts BAB

Actually what I want is to include an scenario with all my global
variables and if I want another scenario I can include it and all the
global variables will change.
module Scenarios
module MyFirstSc
$web=“http://www.elmundo.es
$sqlSearch=“select video from datab”
$user=“Pep”
$password=“xxx”
end
module MySecondSc
$web=“http://www.elmundo.es
$sqlSearch=“select audiodefault from datab”
$user=“Bee”
$password=“2x8”
end
end

In my test cases I’ll have in the first line for example:
include Scenarios::MySecondSc
and if I want to change the scenario I only have to change this line:
include Scenarios::MyFirstSc

How can I do it without including an extraline with a method?
I know I could do something like:
module Scenarios
module MyFirstSc
def getValues
$web=“http://www.elmundo.es
$sqlSearch=“select video from datab”
$user=“Pep”
$password=“xxx”
end
end

end

and in the first line we’ll write:
include Scenarios::MyFirstSc
Scenarios::MyFirstSc.getValues()

But I don’t like this way I would like to do it in only one line… is
it possible???

Thanks for your time.

Hi –

On Thu, 13 Mar 2008, Mario R. wrote:

module MySecondSc
include Scenarios::MyFirstSc
end
it possible???
See Chris’s answer: use constants, and include the module you want.
I’ve been programming in Ruby for 7.5 years and I have no clear memory
of ever having created a global variable. I imagine I have once or
twice, but it’s very, very unlikely that you need to do it or that
it’s the best way to do it in this case.

David

Thanks Morel I think this one could be the solution.
But I have a question for you…
Why do you need super(mod)??

Thanks

Mario R. [email protected] wrote:

n my test cases I’ll have in the first line for example:
include Scenarios::MySecondSc
and if I want to change the scenario I only have to change this line:
include Scenarios::MyFirstSc

I think this code will do what you require

module Scenarios

module Default
def self.included(mod)
super(mod)
$bab=“defaultmodulevalue”
end
end

module DefaultHidden
def self.included(mod)
super(mod)
$bab=“hiddenmodulevalue”
end
end

module DefaultSecond
def self.included(mod)
super(mod)
$bab=“secondmodulevalue”
end
end
end

Module#included gets sent automatically by Ruby when you include a
module, so you do not need to invoke it explicitly.

Splenetico [email protected] wrote:

get done.
OOps, wrong nick :slight_smile:

Thanks everybody for your time and suggestions.

Mario R. [email protected] wrote:

Thanks Morel I think this one could be the solution.
But I have a question for you…
Why do you need super(mod)??

Because we are replacing (overriding) a previous version of
Module#included.

super(mod) ensures that whatever the previous version did continues to
get done.