Thanks Ar Chon for the prompt response. But that runs me to another
question.
How is Filter.find() different from ::Filter.find()?
::Filter makes ruby look from the top of the name space, so if you
have
module Foo
class Filter
end
def get_filter
::Filter
end
end
class Filter
end
then the :: means you get the top level Filter class rather than
Foo::Filter
Fred
Thanks for the clarification Frederick. So if I am not wrong top level
class is nothing but in the Object level space, isn't it?
I believe so.
Also your lack of response for my other question "how does these effect
the Dependencies mechanism?", I am assuming it shouldn't be a problem.
As we are asking ruby to look for the top level class, it is the same as
asking Filter.find() as in the case we would generally do when there is
no conflicting class is my situation.
And finally I am assuming from the your example (with my additional
method):
module Foo
class Filter
end
def get_filter
::Filter
end
def get_my_filter
self::Filter (or)
Filter (same as self::Filter)
end
end
def get_outer_filter
self::Filter
end
class Filter
end
get_filter -> returns outer class Filter
get_my_filter -> returns Foo::Filter
get_outer_filter -> returns outer class Filter
so self::Filter depends in the context of self. Any corrections are
appreciated.
Filter and self::Filter are not the same, because constants are looked
up lexically eg:
module Foo
class Filter
def self.name; 'inner'; end
end
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def with_self
self::Filter
end
def bare
Filter
end
end
end
class Bar
class Filter
def self.name; 'from bar'; end
end
include Foo
end
Then Bar.bare.name #=> "inner"
Bar.with_self.name #=> "from bar"
Fred