Tôi đã thử một số điều trong REPL của Julia (1.2) và tôi đã tập trung suy nghĩ về điều gì đó mà tôi không hiểu về việc gửi đi.
Lần đầu tiên tôi đã thử thứ này đang hoạt động theo cách tôi mong đợi:
f(a::T) where {T <: Int} = "Test"
Gọi f (3) hoạt động kể từ khi
Int <: Int == true
Gọi f ("Hello") dẫn đến lỗi "Phương thứcError: không khớp phương thức" kể từ khi
String <: Int == false
Sau đó, tôi đã thử phương pháp này và tôi không hiểu tại sao gọi nó hoạt động trong một số trường hợp:
f(a::T, b::U) where {T, U <: T} = "Another Test"
Gọi f (3, 3) hoạt động (như tôi mong đợi)
NHƯNG f (3, "Xin chào") cũng hoạt động và không ném "Phương thứcError: không khớp phương thức" ???
Tôi nghĩ rằng (vì T trở thành một Int và U a String) String <: Int == false
???
Tôi đoán rằng tôi đang thiếu một cái gì đó khá đơn giản ở đây nhưng tôi không thể tìm thấy nó ... Vì vậy, đây là câu hỏi của tôi, tại sao f (3, "Xin chào") đang hoạt động ???
Hơn nữa, tôi đã thử đoạn mã này (tôi đã cố gắng tạo lại chữ ký phương thức thứ hai) và nó đã thất bại chính xác như tôi mong đợi:
Test = Tuple{T, U} where {T, U <: T}
Test{Int, String}
(điều này không thành công như tôi mong đợi với "TypeError: in Type, in U, U <: Int64, got Type {String}")
Int64,String,false
. Bạn có thể cần phải khởi động lại Julia nếu bạn thêm phương thức vào hàm. Chỉ cần sử dụng một nhân vật mới, ví dụh
cho một thử nghiệm mới. Đối với câu hỏi của bạn: Có vẻ như hệ thống cố gắng tìm bất kỳ giải pháp nào cho hạn chế loại vàT=Any, U=Any where U:<T
là một. Nếu bạn giới thiệu một loại cụ thể như trong ví dụ thứ ba của bạn, nó hoạt động như mong đợi. Những người có kiến thức hệ thống âm thanh Julia sẽ sớm đưa ra câu trả lời thích hợp cho vấn đề này.