Stefan Lang
12/11/2005 11:23:00 AM
On Sunday 11 December 2005 09:52, cap wrote:
> Both of them has a class named "Logger"
>
> I used to include Log4r in my code so I can use Logger as a
> shortcut of Log4r::Logger .
> It works ok when useing "Logger[name]" to get logger
I know it doesn't help now: As a general suggestion: Never
include a module at the top level only to get shorter names!
Ruby's include is *not* like "import" in Java or "using" in
C# or "from xy import *" in Python.
> Today I add the library "bluecloth" to my application. I found that
> when requiring bluecloth,BlueCloth required 'logger' in its
> "bluecloth.rb", So Ruby's internal Logger class overwrite the
> Log4r::Logger in context, and doing 'include Log4r' again didn't
> make the Logger turn back. The Logger is always ruby's internal
> Logger and mine "Logger[name]' can't execute now (maybe the
> priority of "include Log4r" is less than "require 'logger' ?")
>
> Is there any solution except replacing every "Logger" to
> "Log4r::Logger" in my code?
If it is possible to wrap your code in a module:
module MyNamespace
include Log4r
# Now Logger will always reference Log4r::Logger
end
Or even better:
module MyNamespace
# don't include other Log4r methods and constants,
# just create a shortcut for Log4r::Logger
Logger = Log4r::Logger
# define classes, modules, ...
end
Regards,
Stefan