2016-04-17 7 views
0

В моей недавней помощи в разработке пакета Dataframe для Torch. Поскольку база кода быстро удваивается, необходимо разбить класс на несколько разделов для лучшей организации и последующего наблюдения (issue #8).Как разбить класс факела на несколько файлов в скале Lua

Простой тест-класс будет test.lua файл в корневой папке тест-пакета:

test = torch.class('test') 
function test:__init() 
    self.data = {} 
end 

function test:a() 
    print("a") 
end 

function test:b() 
    print("b") 
end 

Теперь rockspec для этого было бы просто:

package = "torch-test" 
version = "0.1-1" 
source = { 
    url = "..." 
} 
description = { 
    summary = "A test class", 
    detailed = [[ 
     Just an example 
    ]], 
    license = "MIT/X11", 
    maintainer = "Jon Doe" 
} 
dependencies = { 
    "lua ~> 5.1", 
    "torch >= 7.0", 
} 
build = { 
    type = 'builtin', 
    modules = { 
     ["test"] = 'test.lua', 
    } 
} 

ответ

0

Чтобы получить несколько файлов для работы для одного класса, необходимо вернуть первоначально созданный объект класса и передать его в подразделы. Приведенный выше пример может быть введен в структуру файла:

\init.lua 
\main.lua 
\test-0.1-1.rockspec 
\Extensions\a.lua 
\Extensions\b.lua 

В luarocks install/make копирует файлы в соответствии с «требуется» синтаксис, где каждый . обозначает каталог и .lua остается вне, то есть нам нужно изменить rockspec к :

package = "torch-test" 
version = "0.1-1" 
source = { 
    url = "..." 
} 
description = { 
    summary = "A test class", 
    detailed = [[ 
     Just an example 
    ]], 
    license = "MIT/X11", 
    maintainer = "Jon Doe" 
} 
dependencies = { 
    "lua ~> 5.1", 
    "torch >= 7.0", 
} 
build = { 
    type = 'builtin', 
    modules = { 
     ["test.init"] = 'init.lua', 
     ["test.main"] = 'main.lua', 
     ["test.Extensions.a"] = 'a.lua', 
     ["test.Extensions.b"] = 'b.lua' 
    } 
    } 

выше, таким образом, создать тест -folder где пакеты проживают вместе с файлами и подкаталогами. Инициализации класса в настоящее время проживает в init.lua, который возвращает объект класса:

test = torch.class('test') 
function test:__init() 
    self.data = {} 
end 
return test 

подклассу-файлы теперь необходимо поднять объект класса, который передается с помощью loadfile() (см init.lua файл ниже). a.lua теперь должен выглядеть следующим образом:

local params = {...} 
local test = params[1] 
function test:a() 
    print("a") 
end 

и подобное дополнение к b.lua:

local params = {...} 
local test = params[1] 
function test:b() 
    print("b") 
end 

Для того, чтобы склеить все вместе мы имеем файл init.lua. Ниже, вероятно, немного слишком сложно, но это берет на себя:

  • Поиск всех расширений доступны и загружая их (Примечание: требует lua filesystem, что вы должны добавить к rockspec и вам все еще нужно добавить каждый файл в rockspec или он не будет находиться в папке Extensions)
  • Определяет пути папки
  • загружает main.lua
  • работает в чистом испытательной среде без пакета установлен

Код для init.lua:

require 'lfs' 

local file_exists = function(name) 
    local f=io.open(name,"r") 
    if f~=nil then io.close(f) return true else return false end 
end 

-- If we're in development mode the default path should be the current 
local test_path = "./?.lua" 
local search_4_file = "Extensions/load_batch" 
if (not file_exists(string.gsub(test_path, "?", search_4_file))) then 
    -- split all paths according to ; 
    for path in string.gmatch(package.path, "[^;]+;") do 
    -- remove trailing ; 
    path = string.sub(path, 1, string.len(path) - 1) 
    if (file_exists(string.gsub(path, "?", "test/" .. search_4_file))) then 
     test_path = string.gsub(path, "?", "test/?") 
     break; 
    end 
    end 
    if (test_path == nil) then 
    error("Can't find package files in search path: " .. tostring(package.path)) 
    end 
end 

local main_file = string.gsub(test_path,"?", "main") 
local test = assert(loadfile(main_file))() 

-- Load all extensions, i.e. .lua files in Extensions directory 
ext_path = string.gsub(test_path, "[^/]+$", "") .. "Extensions/" 
for extension_file,_ in lfs.dir (ext_path) do 
    if (string.match(extension_file, "[.]lua$")) then 
    local file = ext_path .. extension_file 
    assert(loadfile(file))(test) 
    end 
end 

return test 

Я надеюсь, что это помогает, если вы столкнетесь с той же проблемой и найти документацию немного слишком разреженный. Если вам посчастливилось узнать лучшее решение, пожалуйста, поделитесь.