2017-04-19 15 views
5

Về cơ bản tôi muốn một mô-đun có thể sử dụng các chức năng nằm ngoài phạm vi của nó. tôi cần điều này vì công việc của tôi sẽ chỉ cung cấp một khuôn khổ mà người dùng sẽ có thể đặt mã riêng của mình trong. Một cái gì đó nhưBạn có thể sử dụng các chức năng từ bên ngoài mô-đun bên trong mô-đun

Simulation.jl

abstract AbstractType 

function startSimulation(unknown::AbstractType) 
    doStuff(unknown) 
end 

MyModule.jl này

module MyModule 
    include("Simulation.jl") 
    export AbstractType, startSimulation 
end 

SomeImplementation.jl

type ConcreteType <: AbstractType 
    variable::Int64 
end 

doStuff(me::ConcreteType) 
    me.variable 
end 

và cuối cùng là Main.j l

# push!(LOAD_PATH, pwd()) # for local usage 
using MyModule 
include("SomeImplementation.jl") 
startSimulation(ConcreteType(5)) 

Trường hợp Simulation.jl và MyModule.jl được viết bởi tôi và SomeImplementation.jl và Main.jl được viết bởi người dùng. Bây giờ ví dụ trên không hoạt động, bởi vì các mô-đun có không gian tên riêng và thậm chí tho SomeImplementation.jl được nhập vào chính tại dòng 3, trình thông dịch sẽ không nhìn thấy nó trong dòng 4 của Simulation.jl.

Tôi không thể nhập bất kỳ thứ gì trong MyModule.jl, bởi vì tôi không thể biết người dùng sẽ đặt tên cho công cụ của mình hoặc những gì cần thêm nữa.

Có cách nào để thực hiện việc này với mô-đun không? Nếu không, tôi sẽ không sử dụng các mô-đun.

Trả lời

10

Câu trả lời ở đây là tạo sơ khai cho tất cả các hàm bạn muốn gọi trong phạm vi MyModule làm giao diện bắt buộc cho các loại phụ tùy chỉnh là AbstractType. Đó là, trong vòng MyModule, bạn phải:

abstract AbstractType 

doStuff(::AbstractType) = error("custom AbstractType objects must define a `doStuff` method) 

function startSimulation(unknown::AbstractType) 
    doStuff(unknown) 
end 

Sau đó, việc triển khai bê tông chỉ cần đặc biệt thêm phương pháp doStuff của họ để các chức năng trong MyModule bằng cách nhập nó hoặc đủ điều kiện nó:

MyModule.doStuff(me::ConcreteType) 
    me.variable 
end 
+0

Cảm ơn nhiều! Đặc biệt là các cuống sẽ giúp rất nhiều để thông báo cho người sử dụng như làm thế nào để mã chống lại giao diện của tôi. Tôi đã không di chuyển hàm thoạt phỏng bắt đầu của mình. Bất kỳ lý do nào là tại sao bạn đặt nó vào tệp mô-đun? – Nozdrum

+0

Nó không thực sự quan trọng như thế nào bạn tổ chức module của bạn thành các tập tin riêng biệt. Mã này chỉ cần sống trong khối 'module', trực tiếp hoặc thông qua' include'. –

Các vấn đề liên quan