Dấu chấm than ở đây không phải là toán tử, nó chỉ là một phần mã thông báo của cú pháp khởi tạo khuôn mẫu rõ ràng (được mô tả chi tiết here).
std.conv.to
(docs) là mẫu chức năng để chuyển đổi giữa các loại tùy ý. Nó được thực hiện hoàn toàn trong thư viện và không có hỗ trợ đặc biệt trong ngôn ngữ. Nó có phạm vi rộng hơn và khác so với toán tử truyền.
Mẫu to
lấy hai tham số loại; loại "đến" và loại "từ", theo thứ tự đó. Trong ví dụ của bạn, mẫu được khởi tạo rõ ràng với đối số loại đơn ushort
cho tham số "đến" và đối số loại thứ hai string
(giả sử args
xuất phát từ tham số đầu tiên đến main
) được tự động suy ra từ đối số hàm thông thường được chuyển đến hàm (args[1]
) làm tham số "từ".
Hàm kết quả nhận tham số chuỗi và trả về phân tích cú pháp phân tích từ chuỗi đó hoặc ném một ngoại lệ nếu nó không thành công. Toán tử truyền sẽ không thử loại chuyển đổi cấp cao này.
Lưu ý rằng nếu có nhiều hơn một tham số mẫu rõ ràng, hoặc tham số đó có nhiều hơn một thẻ trong nó (ushort
là một thẻ từ khóa duy nhất), bạn phải quấn mẫu danh sách tham số trong ngoặc đơn:
ushort result;
result = to!(typeof(result))(args[1]);
Trong ví dụ này, typeof
, (
, result
và )
là bốn mã thông báo riêng biệt và do đó cần có dấu ngoặc đơn.
Để trả lời câu hỏi cuối cùng của bạn, !
thẻ cũng được sử dụng cho các nhà điều hành unary không, không liên quan đến mẫu instantiations:
bool yes = true;
bool no = !yes; // 'no' is false
Nguồn
2011-12-24 10:22:27
cảm ơn rất nhiều =] câu trả lời tuyệt vời! – thwd
Dường như cũng vậy! là nhiều hơn của một diễn viên từ vựng, ví dụ! string (f) là hợp lệ cho điểm nổi f và cast (string) f - not. –
Tôi sẽ chỉ ra rằng kỹ thuật nói 'to! Ushort (val)' không thực sự là một diễn viên. Đó là một chuyển đổi sử dụng hàm 'std.conv.to'. Nó đã được kiểm tra, nhưng nếu bạn bắt đầu gọi nó là một diễn viên, bạn có nguy cơ gây nhầm lẫn. Việc đúc chỉ được thực hiện với toán tử truyền. –