পছন্দসই সংস্করণ আপনার কাছে যা আছে তার থেকে কিছুটা আলাদা। লাইন
v[v[1]] = 999;
আসলে desugars
*IndexMut::index_mut(&mut v, *Index::index(&v, 1)) = 999;
এটি একই ত্রুটির বার্তায় প্রকাশিত হয় তবে টীকাগুলি কী ঘটছে তার ইঙ্গিত দেয়:
error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable
--> src/main.rs:7:48
|
7 | *IndexMut::index_mut(&mut v, *Index::index(&v, 1)) = 999;
| ------------------- ------ ^^ immutable borrow occurs here
| | |
| | mutable borrow occurs here
| mutable borrow later used by call
আপনার পছন্দসই সংস্করণে গুরুত্বপূর্ণ পার্থক্য হল মূল্যায়ন আদেশ। ফাংশন কলের আর্গুমেন্টগুলি ফাংশন কল করার আগে তালিকাভুক্ত ক্রমে বাম থেকে ডানদিকে মূল্যায়ন করা হয়। এই ক্ষেত্রে এর অর্থ হ'ল প্রথমে &mut vমূল্যায়ন করা হয়, পারস্পরিকভাবে ablyণ নেওয়া v। এরপরে, Index::index(&v, 1)মূল্যায়ন করা উচিত, তবে এটি সম্ভব নয় - vইতিমধ্যে পরস্পর ধার করা হয়েছে। পরিশেষে, সংকলকটি দেখায় যে ফাংশন কলের জন্য এখনও পরিবর্তনীয় রেফারেন্সের প্রয়োজন আছে index_mut(), তাই ভাগ করে নেওয়া রেফারেন্সটি চেষ্টা করার পরে পরিবর্তিত রেফারেন্সটি এখনও বেঁচে থাকবে।
প্রকৃতপক্ষে সংকলিত সংস্করণটির কিছুটা আলাদা মূল্যায়নের ক্রম রয়েছে।
*v.index_mut(*v.index(1)) = 999;
প্রথমত, পদ্ধতি কলগুলিতে ফাংশন আর্গুমেন্টগুলি বাম থেকে ডানদিকে *v.index(1)মূল্যায়ন করা হয় , অর্থাত প্রথমে মূল্যায়ন করা হয়। এর ফলে একটি হয় usizeএবং সাময়িকভাবে ভাগ করা orrowণ vআবার প্রকাশ করা যেতে পারে। তারপরে, প্রাপককে index_mut()মূল্যায়ন করা হয়, অর্থ vপারস্পরিকভাবে ধার করা হয়। ভাগ করে নেওয়া alreadyণ ইতিমধ্যে চূড়ান্ত হয়ে গেছে এবং পুরো প্রকাশটি orrowণ পরীক্ষককে পাস করে, এটি কাজ করে।
নোট করুন যে সংস্করণটি সংকলন করে কেবল এটি "অ-লেসিকাল লাইফটাইমস" প্রবর্তনের পরে তা করে। মরিচের পূর্ববর্তী সংস্করণগুলিতে, ভাগ করা theণ প্রকাশের শেষ অবধি বেঁচে থাকবে এবং ফলস্বরূপ ত্রুটি ঘটবে।
আমার মতে সবচেয়ে পরিষ্কার সমাধান হল একটি অস্থায়ী পরিবর্তনশীল ব্যবহার:
let i = v[1];
v[i] = 999;