[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: package.path doesn't contain './?/init.lua'
- From: Peter Cawley <lua@...>
- Date: Tue, 28 Apr 2009 10:17:20 +0100
My approach would be something like:
-- obj.lua
local setmetatable = setmetatable
module(...)
local obj = _M
obj.__index = obj -- obj doubles as a metatable
function obj.new()
local self = setmetatable({}, obj)
return self
end
function obj:method(...)
end
-- usage
require "obj" -- OR local obj = require "obj"
o = obj.new()
o:method("etc.")
On Tue, Apr 28, 2009 at 5:46 AM, Geoff Leyland
<geoff_leyland@fastmail.fm> wrote:
> On 28/04/2009, at 1:09 PM, David Manura wrote:
>
>> On Mon, Apr 27, 2009 at 4:15 PM, Geoff Leyland wrote:
>>>
>>> The default package.path contains './?.lua', but not './?/init.lua'.
>>> Obviously, it's easy to add, so there's no problem, but I often find
>>> myself
>>> adding it. Any reason it's not there by default?
>>
>> Perhaps we should instead ask why init.lua it not eliminated entirely.
>> It is not necessary[1], and I think it complicates things[2]. Module
>> authors need to decide which form to use, and it's near certain that
>> different module authors will choose different conventions. Module
>> users or Lua distributions, when adding a directory to the Lua search
>> path, may need to add both forms in general, though omitting the
>> latter might usually work or might appear to initially work. It also
>> opens the ambiguity where ".../a/init.lua" could represent the module
>> "a" or a module actually named "a.init". Finally, it makes module
>> search errors longer for the end-user:
>
> While we're discussing packages, what's the logic behind the difference
> between what's returned by require and what's put in _G?
>
> mod.lua:
> module(...)
> a = 1
> return 3
>
>> print(require("mod"))
> 2
>> print(type(mod))
> table
>
> This may seem irrelevant, but I often put a single class or function into a
> file:
>
> obj.lua:
> local setmetable = setmetatable
> module(...)
> obj = {}
> function obj:new()
> self.__index = self
> return setmetatable({}, self)
> end
>
> and create a new obj I have to go:
>
>> require("obj")
>> o = obj.obj:new()
>
> which is a bit awkward.
>
> An alternative is to put a "return obj" at the end of obj.lua, and then I
> need to go
>> local obj = require("obj")
>> o = obj:new()
>
> Where I have to add the "local obj ="
>
> One workaround is:
>
> obj.lua:
> local setmetable = setmetatable
> module(...)
> function new(self)
> self.__index = self
> return setmetatable({}, self)
> end
>
>> require("obj")
>> o = obj:new()
>
> But I kind of get the feeling I'm not Doing The Right Thing in all these
> cases. I don't have any solution to this, or any strong opinions, just
> wondering if anyone has a better idea.
>
> Cheers,
> Geoff
>
>
>
>
>