Tôi muốn xác định hàm f(x, t::Type)
thực thi hành vi khác nhau tùy thuộc vào việc isa(x, t)
. Giả sử tôi muốn gọi b1(x)
nếu có, và b2(x)
nếu không.Trong Julia, làm cách nào để thực hiện phương thức gửi đúng trên các đối số của các loại (siêu) cũng được cung cấp bởi người gọi?
Tôi biết rằng tôi có thể làm một kiểm tra năng động trong thời gian chạy như thế này:
function f(x, t::Type)
if isa(x, t)
b1(x)
else
b2(x)
end
end
Tuy nhiên, có một cách để làm điều này hoàn toàn với phương pháp công văn tham số? Ví dụ, nếu tôi xác định
f{T}(x::T, t::Type{T}) = b1(x)
f(x, t::Type) = b2(x)
cho f(1, Int)
và f(1.0, Int)
hành vi đúng được gọi. Nhưng tôi muốn điều này cũng làm việc cho tất cả các phân nhóm của t
:
f(1, Number)
Điều này thực sự gọi b2
vì chữ ký đầu tiên của f
không phù hợp. Điều thú vị là, mặc dù, f(x::Number, t::Type{Number}) = b1(x)
sẽ khớp trong trường hợp này.
Tôi có thiếu điều gì đó hiển nhiên ở đây không?
Đây dường như là lỗi và được sửa trong 0.4.
Câu hỏi:
Tại saof{T}(x::T, t::Type{T})
không phù hợp chof(1, Number)
, mặc dù có là một loại thay thế choT
(Number
) mà sẽ phù hợp?Sử dụng
f{T2, T1 <: T2}(x::T1, t::Type{T2})
hoặc một cái gì đó tương tự không hoạt động vì tất cả các tham số tĩnh chỉ xuất hiện sau khi danh sách tham số tĩnh hoàn chỉnh được đóng lại. Tại sao?Có bất kỳ hình phạt về hiệu suất nào khi sử dụng phương pháp động không?
gì về việc xác định các phương pháp như một chức năng bên trong, vì vậy tôi có thể ràng buộc
t
cho một biến địa phương, như thế này:function f(x, t::Type); g(x::t) = b1(x); g(x) = b2(x); g(x) end
đó làm việc, nhưng chi phí thực hiện là gì?
Cách thành ngữ/ưu tiên để giải quyết vấn đề này là gì?
(Tôi đã cố gắng này trên 0.3.2.)
Tôi có phiên bản Julia Version 0.4.0-dev + 1307 và f (1, Number) gọi b1 –
Bạn nói đúng, tôi đã xác nhận rằng điều này hoạt động trên 0.4.0-dev + 1521. Cảm ơn – user4235730