From: "Michael T. Richter" Date: 2008-05-21T11:19:23+09:00 Subject: Re: 13 lines of confusion --=-V0D/J2oWrT9zEeS3qdj2 Content-Type: multipart/alternative; boundary="=-3bOrM2gaeze/alPrmlPj" --=-3bOrM2gaeze/alPrmlPj Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Oops. Forgot to mention: I've also tried putting each module into a separate file which is then required. Same result. On Wed, 2008-05-21 at 11:02 +0900, Michael T. Richter wrote: > I can't for the life of me figure out why the following code makes > Ruby puke when I try to execute it: >=20 >=20 > module Rlang > module Error > class RlangException < Exception ; end > end > module Utility > def e8(value) ; [value].pack('C') ; end > end > module External > include Rlang::Error > include Rlang::Utility > TAG_CACHED_ATOM =3D e8(67) > end > end >=20 >=20 > The precise error I get is "junk.rb:11: undefined method `e8' for > Rlang::External:Module (NoMethodError)" which is the line with > "TAG_CACHED_ATOM =3D ..." in it. I've tried the following changes with > the following results: >=20 > 1. Completely specify e8 by using "Rlang::Utility.e8" or > "Rlang::Utility::e8". This produces no change to the message > whatsoever.=20 > 2. Renaming bits and pieces under the assumption that I've got a > naming clash with something deep. This only changes the name > of the method it claims to not be able to find.=20 > 3. Moving the definition of e8 to be in the External module. > This is where brain damage sets in as the message doesn't > change in the slightest. (I am well and truly baffled by this > stage.)=20 > 4. Moving the definition of e8 to be in the Rlang module. This > results in, you guessed it!, no change to the message at all.=20 > 5. Moving the definition of e8 to be outside of any module at > all. This results in ... it works. >=20 > #5 is a solution but it is a truly suboptimal one in my opinion. I do > not want to clutter up the global namespace of my clients with cryptic > little utility functions (in the real code there's about a dozen of > these). So while I could live with #5, I would rather not if there > was a better way to do this. Something deep about Ruby's module > system is eluding me here, I think, and I'd rather understand it than > just cover it over and inconvenience my clients' coding in the > process. >=20 > --=20 > Michael T. Richter (GoogleTalk: > ttmrichter@gmail.com) > The most exciting phrase to hear in science - the one that heralds new > discoveries - is not "Eureka!" but "That's funny..." (Isaac Asimov) --=20 Michael T. Richter (GoogleTalk: ttmrichter@gmail.com) I can see computers everywhere - except in the productivity statistics! (Robert Solow) --=-3bOrM2gaeze/alPrmlPj Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable Oops.  Forgot to mention: I've also tried putting each module into a s= eparate file which is then required.  Same result.

On Wed, 2008-05-21 at 11:02 +0900, Michael T. Richter wrote:
I can't for the life of me figure out why the f= ollowing code makes Ruby puke when I try to execute it:

module Rlang
  module Error
    class RlangException < Ex=
ception ; end
  end
  module Utility
    def e8(value) ; [value].pack=
('C') ; end
  end
  module External
    include Rlang::Error<=
/TT>
    include Rlang::Utility
    TAG_CACHED_ATOM =3D e8(67)
  end
end

The precise error I get is "junk.rb:11: undefined method `e8' for Rlang::External:= Module (NoMethodError)" which is t= he line with "TAG_CACHED_ATOM =3D ..." in it.  I've tried the fo= llowing changes with the following results:

  1. Completely specify e= 8 by using "Rlang::Utility.e8" or "Rlang::Utility::e8".=   This produces no change to the message whatsoever.
  2. Renaming bits and pi= eces under the assumption that I've got a naming clash with something deep.=   This only changes the name of the method it claims to not be able to= find.
  3. Moving the definitio= n of e8 to be in the External module.  This is where brain damage sets= in as the message doesn't change in the = slightest.  (I am well and truly ba= ffled by this stage.)
  4. Moving the definitio= n of e8 to be in the Rlang module.  This results in, you guessed it!, = no change to the message at all.
  5. Moving the definitio= n of e8 to be outside of any module at all.  This results in ... it wo= rks.

#5 is a solution but it is a truly suboptimal o= ne in my opinion.  I do not want to clutter up the global namespace of= my clients with cryptic little utility functions (in the real code there's= about a dozen of these).  So while I <= B>could live with #5, I would rather not= if there was a better way to do this.  Something deep about Ruby's mo= dule system is eluding me here, I think, and I'd rather understand it than = just cover it over and inconvenience my clients' coding in the process.

--
Michael T. Richter <ttmri= chter@gmail.com> (GoogleTalk: ttmrichter@gmail.com)
The most exciting phrase to hear in science - the one that heralds new d= iscoveries - is not "Eureka!" but "That's funny..." (Is= aac Asimov)
--
Michael T. Richter <ttmri= chter@gmail.com> (GoogleTalk: ttmrichter@gmail.com)
I can see computers everywhere - except in the productivity statistics! = (Robert Solow)
--=-3bOrM2gaeze/alPrmlPj-- --=-V0D/J2oWrT9zEeS3qdj2 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBIM4ahLqyWkKVQ54QRAvkxAKCaCJytZwfqYebI7S6bOOcK0pi37QCeLBKx f+RIWAmzExFPImvPuK0CCPs= =cpbT -----END PGP SIGNATURE----- --=-V0D/J2oWrT9zEeS3qdj2--