2014-07-25 13 views
6

Tôi mới làm quen với Julia, vì vậy điều này có thể không đáng kể.Không tìm thấy chữ ký chức năng mặc dù hiển thị bằng các phương thức (...)

Tôi có một định nghĩa hàm trong một mô-đun đó trông như thế (sử dụng URIParser):

function add!(graph::Graph, 
       subject::URI, 
       predicate::URI, 
       object::URI) 
    ... 
end 

Bên ngoài của mô-đun, tôi gọi:

add!(g, URIParser.URI("http://test.org/1"), URIParser.URI("http://test.org/2"), URIParser.URI("http://test.org/1")) 

nào mang lại cho tôi lỗi này:

ERROR: no method add!(Graph,URI,URI,URI) 
in include at boot.jl:238 
in include_from_node1 at loading.jl:114 
at /Users/jbaran/src/RDF/src/RDF.jl:79 

Lạ. Bởi vì khi tôi có thể nhìn thấy một chữ ký phù hợp:

julia> methods(RDF.add!) 
# 4 methods for generic function "add!": 
add!(graph::Graph,subject::URI,predicate::URI,object::Number) at /Users/jbaran/src/RDF/src/RDF.jl:29 
add!(graph::Graph,subject::URI,predicate::URI,object::String) at /Users/jbaran/src/RDF/src/RDF.jl:36 
add!(graph::Graph,subject::URI,predicate::URI,object::URI) at /Users/jbaran/src/RDF/src/RDF.jl:43 
add!(graph::Graph,statement::Statement) at /Users/jbaran/src/RDF/src/RDF.jl:68 

Lúc đầu, tôi nghĩ rằng nó là sử dụng của tôi về đối tượng :: Union (...), nhưng ngay cả khi tôi xác định ba chức năng với Number, String, và URI, Tôi gặp lỗi này.

Có điều gì đó hiển nhiên mà tôi bị thiếu không? Tôi đang sử dụng Julia 0.2.1 x86_64-apple-darwin12.5.0, nhân tiện.

Cảm ơn,

Kim

+0

Điều gì xảy ra nếu bạn thực hiện 'RDF.add! (G, URIParser.URI (" http://test.org/1 "), URIParser.URI (" http://test.org/2 "), URIParser.URI ("http://test.org/1")) '? –

+0

Cũng hoạt động, nhưng cuối cùng đã đi cho việc thực hiện đưa ra trong câu trả lời được chấp nhận. – Joachim

Trả lời

4

này có vẻ như bạn có thể nhận được chút bởi sự khác biệt rất nhỏ giữa phương pháp mở rộng và chức năng shadowing.

Đây là sự thiếu hụt của nó. Khi bạn viết function add!(::Graph, ...); …; end;, Julia xem chỉ phạm vi địa phương của bạn và xem nếu add! được xác định. Nếu có, thì nó sẽ mở rộng hàm đó bằng chữ ký phương thức mới này. Nhưng nếu nó chưa được định nghĩa cục bộ, thì Julia tạo một biến cục bộ mới add! cho hàm đó.

Khi nhận xét của JMW gợi ý, tôi đặt cược rằng bạn có hai chức năng độc lập độc lập add!. Base.add!RDF.add!. Trong mô-đun RDF của bạn, bạn đang che khuất định nghĩa của Base.add!. Điều này tương tự như cách bạn có thể đặt tên biến cục bộ pi = 3 mà không ảnh hưởng đến Base.pi thực ở các phạm vi khác. Nhưng trong trường hợp này, bạn muốn hợp nhất các phương thức của mình với hàm Base.add! và để cho nhiều công văn xử lý độ phân giải.

Có hai cách để có được những hành vi phương pháp khuyến nông:

  1. Trong phạm vi module RDF của bạn, nói import Base: add!. Điều này rõ ràng mang lại Base.add! vào phạm vi địa phương của bạn là add!, cho phép tiện ích mở rộng phương thức.

  2. Xác định rõ ràng các phương pháp của bạn là function Base.add!(graph::Graph, …). Tôi thích hình thức này vì nó rõ ràng hơn tài liệu ý định của bạn để mở rộng chức năng Base tại trang định nghĩa.

Điều này chắc chắn có thể được ghi nhận rõ hơn. Có một tham chiếu ngắn về điều này trong phần Modules và hiện tại có a pull request sẽ sớm được hợp nhất để trợ giúp.

+0

Tuyệt vời! Cảm ơn bạn! Tôi đã đi cho đề nghị thứ hai của bạn, cũng đọc lên trên phạm vi, và tất cả mọi thứ hoạt động tốt ngay bây giờ! – Joachim

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