Tôi đã chơi với Rust theo số porting my Score4 AI engine cho nó - dựa trên công việc về triển khai thực hiện kiểu hàm của tôi trong OCaml. Tôi đặc biệt muốn xem Rust giá với mã kiểu chức năng như thế nào.Tại sao đối số cho kết quả tìm thấy cần hai ký hiệu và?
Kết quả cuối cùng: Nó hoạt động và rất nhanh - nhanh hơn nhiều so với OCaml. Nó gần như chạm vào tốc độ của C/C++ theo phong cách bắt buộc - điều thực sự tuyệt vời.
Có một điều khiến tôi phiền lòng, tuy nhiên - tại sao tôi cần hai ký hiệu ở dòng cuối cùng của mã này?
let moves_and_scores: Vec<_> = moves_and_boards
.iter()
.map(|&(column,board)| (column, score_board(&board)))
.collect();
let target_score = if maximize_or_minimize {
ORANGE_WINS
} else {
YELLOW_WINS
};
if let Some(killer_move) = moves_and_scores.iter()
.find(|& &(_,score)| score==target_score) {
...
Tôi đã thêm chúng là do lỗi trình biên dịch "hướng dẫn" tôi đến nó; nhưng tôi đang cố gắng để hiểu tại sao ... Tôi đã từng lừa đề cập ở những nơi khác trong Stack Overflow để "hỏi" trình biên dịch cho tôi biết những gì một cái gì đó kiểu là:
let moves_and_scores: Vec<_> = moves_and_boards
.iter()
.map(|&(column,board)| (column, score_board(&board)))
.collect();
let() = moves_and_scores;
... mà gây ra lỗi này:
src/main.rs:108:9: 108:11 error: mismatched types:
expected `collections::vec::Vec<(u32, i32)>`,
found `()`
(expected struct `collections::vec::Vec`,
found()) [E0308]
src/main.rs:108 let() = moves_and_scores;
... như tôi đã dự kiến, moves_and_scores
là một vectơ của bộ dữ liệu: Vec<(u32, i32)>
. Nhưng sau đó, các dòng tiếp theo ngay lập tức, iter()
và find()
buộc tôi sử dụng ampersands đôi gớm ghiếc trong tham số đóng cửa:
if let Some(killer_move) = moves_and_scores.iter()
.find(|& &(_,score)| score==target_score) {
Tại sao find
đóng cửa cần hai ampersands? Tôi có thể thấy lý do tại sao nó có thể cần một (vượt qua tuple bằng cách tham khảo để tiết kiệm thời gian/không gian) nhưng tại sao hai? Có phải vì iter
không? Tức là, việc tạo tham chiếu iter
và sau đó find
có thể tham chiếu trên mỗi đầu vào không, do đó tham chiếu về tham chiếu?
Nếu điều này là như vậy, không phải là điều này, được cho là, một lỗ hổng thiết kế khá xấu xí trong Rust?
Thực tế, tôi mong đợi find
và map
và tất cả các phần còn lại của hàm nguyên thủy là một phần của bộ sưu tập. Buộc tôi phải iter()
để thực hiện bất kỳ loại công việc kiểu chức năng nào có vẻ nặng nề, và thậm chí nhiều hơn thế nếu nó ép buộc loại "ampersands kép" này trong mọi chuỗi chức năng có thể.
Tôi hy vọng tôi thiếu điều gì đó hiển nhiên - bất kỳ trợ giúp/giải thích nào được hoan nghênh nhất.
Chúc mừng bạn đã quản lý cổng, đánh bại OCaml trên mã kiểu chức năng có nghĩa là bạn đã làm điều gì đó đúng! –
@MatthieuM. Cảm ơn! Tôi đã hy vọng có một cách sạch hơn để xử lý các chuỗi chức năng (tức là '.iter(). Map (...). Iter(). Filter() ... .iter(). Find (...)') mà không giới thiệu thêm một mức tham chiếu ở mọi bước - nhưng có vẻ như tôi không thể tránh được nó. – ttsiodras