Rustで多くの人が躓くのは借用やムーブのルールだと思う
ポピュラーな言語だと

fn foo(a: Vec<i32) {}
let a = Vec::default();
let b = a;
foo(b);

のような書き方でも単に参照が増えるだけだし、変数が消費されることもないから、
ここでコンパイルエラーになる時点で理解の壁がある
参照を学び始めたときも

fn bar(a: &mut Vec<i32>) {}
let mut a = Vec::default();
let mut b = &a; // これが正しい可変参照の書き方?
let c = &mut a; // それともこれ?
bar(c); // ここは bar(&mut c) じゃなくて良いの?

とかで迷う (自分はだいぶ時間がかかった)
この壁は言語のディープな部分に触れ始めたときじゃなくて、学び始めの頃にぶつかるから挫折しやすいように思う
この後もライフタイムなんかがあるし

OptionやResult, enumやパターンマッチは比較的理解しやすいし、利点も分かりやすい