Forum: Ruby Re: Help with object scope

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
1c1e3bdfe006a22214102fcd6434a012?d=identicon&s=25 Daniel Sheppard (Guest)
on 2005-12-21 07:17
(Received via mailing list)
module M
  class C
   def self.blah
   end
  end
end

module M2
  include M
  class TestM
    def setup; C.blah; end
  end
end

Won't work because the C tries to refer to TestM::C, which doesn't
exist.

Previously, when you did an "include M" you included the module into
Kernel.

Since:
	TestM is an instance of Class
	Class is an instance of Object
	You've included M in Object, causing Object::C to be created

So, in that case TestM::C exists.

> I had a file, in short:
> end
>
> Works great.
>
> *However*, if I wrap the unit tests in their own module, then
> ruby can
> no longer find class C.  Why?  Didn't I include module M?  I'm really
> confused here.
>
> If you want the full source, I can post it.
#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################
#####################################################################################
This e-mail message has been scanned for Viruses and Content and cleared
by NetIQ MailMarshal
#####################################################################################
Ccfe7d097475a32dc3ff78d6fc42c852?d=identicon&s=25 List Recv (lstrecv)
on 2005-12-21 15:22
I see.

So,
1) How do I call C from class TestM without explicitly using its
namespace (M:C)?  Is there no way?  I don't want to modify Kernel or
anything, just have class C available.

2) Could you explain exactly what a Module is?  A namespace? A set of
methods without a home?  I'm really confused... (I know that
module_define and class_define are synonomous, which is even more
confusing...)


Daniel Sheppard wrote:
> module M
>   class C
>    def self.blah
>    end
>   end
> end
>
> module M2
>   include M
>   class TestM
>     def setup; C.blah; end
>   end
> end
>
> Won't work because the C tries to refer to TestM::C, which doesn't
> exist.
>
> Previously, when you did an "include M" you included the module into
> Kernel.
>
> Since:
> 	TestM is an instance of Class
> 	Class is an instance of Object
> 	You've included M in Object, causing Object::C to be created
>
> So, in that case TestM::C exists.
>
>> I had a file, in short:
>> end
>>
>> Works great.
>>
>> *However*, if I wrap the unit tests in their own module, then
>> ruby can
>> no longer find class C.  Why?  Didn't I include module M?  I'm really
>> confused here.
>>
>> If you want the full source, I can post it.
> #####################################################################################
> This email has been scanned by MailMarshal, an email content filter.
> #####################################################################################
> #####################################################################################
> This e-mail message has been scanned for Viruses and Content and cleared
> by NetIQ MailMarshal
> #####################################################################################
37a3c73ffbf864e4b28f7f2384ee12ce?d=identicon&s=25 Timothy Hunter (tim-hunter)
on 2005-12-21 15:49
(Received via mailing list)
List Recv wrote:
> 2) Could you explain exactly what a Module is?  A namespace? A set of
> methods without a home?  I'm really confused... (I know that
> module_define and class_define are synonomous, which is even more
> confusing...)

A little bit of both, actually. Here's a good description of what a
Module is: http://www.rubycentral.com/book/tut_modules.html
E0ed615bd6632dd23165e045e3c1df09?d=identicon&s=25 =?UTF-8?B?RmxvcmlhbiBHcm/Dnw==?= (Guest)
on 2005-12-21 16:25
(Received via mailing list)
List Recv wrote:

> So,
> 1) How do I call C from class TestM without explicitly using its
> namespace (M:C)?  Is there no way?  I don't want to modify Kernel or
> anything, just have class C available.

Try this instead:

> class TestM
>   include M
>   def setup; C.blah; end
> end

A module is a set of instance methods and constants. It can either be
used as a namespace or mix-in functionality. (For the latter you are
collecting similar methods / constants together in one Module so you can
add them to your own classes or objects easily.)

mod_or_cls.include(mod) will add all constants and instance methods of
mod to mod_or_cls.

obj.extend(mod) will add all constants and instance methods of mod to an
object itself.

Here's a sample:

module HalfString
   def half()
     self[0, length / 2]
   end
end

str = "foobar"
str.half() # raises NoMethodError
str.extend(HalfString)
str.half() # => "foo"

"hello".half() # raises NoMethodError

You can't ever include classes. You can only inherit from them.
Ccfe7d097475a32dc3ff78d6fc42c852?d=identicon&s=25 List Recv (lstrecv)
on 2005-12-22 05:46
> Try this instead:
>
>> class TestM
>>   include M
>>   def setup; C.blah; end
>> end

I see.

So, that's the equivalent of:

class TestM
  class C; ... ; end
  def setup; C.blah ; end
end

What exactly does it mean to nest a class?
I know that you cannot define a class within a method (not sure why)?

Also, is require the same thing as "copy and paste dynamically", or does
it drop down to the global namespace, or do something else?
This topic is locked and can not be replied to.