মরচে আগন্তুক হিসাবে আমার বোধগম্যতা হ'ল সুস্পষ্ট জীবনকাল দুটি উদ্দেশ্য উপভোগ করে।
কোনও কার্যক্রমে একটি স্পষ্ট আজীবন টীকা রাখলে সেই ফাংশনের অভ্যন্তরে যে ধরণের কোড উপস্থিত হতে পারে তা সীমাবদ্ধ করে। সুস্পষ্ট লাইফটাইম সংকলককে নিশ্চিত করতে অনুমতি দেয় যে আপনার প্রোগ্রামটি যা ইচ্ছা তা করছে।
আপনি যদি (সংকলক) কোডের কোনও অংশটি বৈধ কিনা তা পরীক্ষা করতে (গুলি) চাইলে আপনাকে (সংকলক) পুনরাবৃত্তভাবে বলা প্রতিটি ফাংশনের ভিতরে তাকাতে হবে না। কোডটির এই অংশটি দ্বারা সরাসরি কল করা ফাংশনগুলির টীকাগুলিতে একবার নজর রাখা যথেষ্ট। এটি আপনার প্রোগ্রামটি আপনার (সংকলক) সম্পর্কে তর্ক করার পক্ষে অনেক সহজ করে তোলে এবং সংকলনের সময়কে পরিচালনাযোগ্য করে তোলে।
১ ম পয়েন্টে, পাইথনে লেখা নিম্নলিখিত প্রোগ্রামটি বিবেচনা করুন:
import pandas as pd
import numpy as np
def second_row(ar):
return ar[0]
def work(second):
df = pd.DataFrame(data=second)
df.loc[0, 0] = 1
def main():
# .. load data ..
ar = np.array([[0, 0], [0, 0]])
# .. do some work on second row ..
second = second_row(ar)
work(second)
# .. much later ..
print(repr(ar))
if __name__=="__main__":
main()
যা মুদ্রণ করবে
array([[1, 0],
[0, 0]])
এই ধরণের আচরণ আমাকে সর্বদা অবাক করে দেয়। যা ঘটছে তা হ'ল df
মেমরি ভাগ করে নেওয়া ar
, সুতরাং যখন কিছু df
পরিবর্তনের বিষয়বস্তু হয় তখন work
সেই পরিবর্তনটি সংক্রামিত ar
হয়। যাইহোক, কিছু ক্ষেত্রে এটি মেমরি দক্ষতার কারণে (কোনও অনুলিপি নয়) ঠিক আপনি যা চান তা হতে পারে। এই কোডটিতে আসল সমস্যাটি হ'ল ফাংশনটি second_row
দ্বিতীয়টির পরিবর্তে প্রথম সারিতে ফিরে আসবে; সৌভাগ্য যে ডিবাগিং।
পরিবর্তে মরচে লেখা একই ধরণের প্রোগ্রামটি বিবেচনা করুন:
#[derive(Debug)]
struct Array<'a, 'b>(&'a mut [i32], &'b mut [i32]);
impl<'a, 'b> Array<'a, 'b> {
fn second_row(&mut self) -> &mut &'b mut [i32] {
&mut self.0
}
}
fn work(second: &mut [i32]) {
second[0] = 1;
}
fn main() {
// .. load data ..
let ar1 = &mut [0, 0][..];
let ar2 = &mut [0, 0][..];
let mut ar = Array(ar1, ar2);
// .. do some work on second row ..
{
let second = ar.second_row();
work(second);
}
// .. much later ..
println!("{:?}", ar);
}
এটি সংকলন, আপনি পাবেন
error[E0308]: mismatched types
--> src/main.rs:6:13
|
6 | &mut self.0
| ^^^^^^^^^^^ lifetime mismatch
|
= note: expected type `&mut &'b mut [i32]`
found type `&mut &'a mut [i32]`
note: the lifetime 'b as defined on the impl at 4:5...
--> src/main.rs:4:5
|
4 | impl<'a, 'b> Array<'a, 'b> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...does not necessarily outlive the lifetime 'a as defined on the impl at 4:5
--> src/main.rs:4:5
|
4 | impl<'a, 'b> Array<'a, 'b> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
প্রকৃতপক্ষে আপনি দুটি ত্রুটি পান, এর ভূমিকা 'a
ও 'b
আন্তঃব্যবস্থাপনাগুলির মধ্যে একটিও রয়েছে । এর টীকাটি দেখে second_row
আমরা দেখতে পেলাম যে আউটপুটটি &mut &'b mut [i32]
আজীবন 'b
(দ্বিতীয় সারির জীবনকাল Array
) সহ একটি রেফারেন্স হিসাবে বিবেচিত হবে । তবে, যেহেতু আমরা প্রথম সারিতে ফিরে আসছি (যার আজীবন রয়েছে 'a
), সংকলক আজীবন মিলবে না বলে অভিযোগ করে। সঠিক জায়গায়। সঠিক সময়ে. ডিবাগিং একটি হাওয়া।