प्रौद्योगिकी साझेदारी

Day2 Rustlings-Move Semantics इत्यनेन सह Rust language इत्यस्य अभ्यासं कुर्वन्तु

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

नमस्कार सर्वेभ्यः

अद्य अहं २०२४ तमस्य वर्षस्य स्वायत्तवाहनचालनओएस विकासप्रशिक्षणशिबिरं - प्राथमिकशिबिरस्य चतुर्थचरणं - ट्यूटोरियलं सम्पन्नवान्

Day2 Rustlings-Move Semantics इत्यनेन सह Rust language इत्यस्य अभ्यासं कुर्वन्तु

alt
alt
alt

https://doc.rust-lang.org/stable/book/ch04-00-स्वामित्व-अवगमनम्.html

यदा अहं कोडं प्रस्तौमि तदा मम अनुमतिः नास्ति इति सन्देशः प्राप्यते ।

alt
alt

असिटोन्

alt

सन्दर्भ विकास वातावरण विन्यास

https://rcore-os.cn/arceos-tutorial-book/ch01-02.html इति ग्रन्थः

मम विषयः

https://github.com/cicvedu/rustlings-semester-4-दृष्टिबिन्दवः

ssh मार्गेण github कोड् क्लोन् कर्तुं ssh कीलं रचयन्तु । Linux वातावरणे ssh-keygen -t rsa -b 4096 -C "your mailbox" इति आदेशस्य उपयोगं कृत्वा ssh कीलं निर्मातुं केवलं Enter नुदन्तु । ततः cat ~/.ssh/id_rsa.pub इत्यस्य उपयोगं कुर्वन्तु

आदिम प्रकार

Rust इत्यस्य द्वे मूलभूतप्रकारे सन्ति ये प्रत्यक्षतया कम्पैलरमध्ये कार्यान्विताः भवन्ति । अस्मिन् खण्डे वयं महत्त्वपूर्णान् गमिष्यामः ।

अधिक जानकारी

alt

Slice Type Slices इत्यनेन भवान् सम्पूर्णसङ्ग्रहस्य अपेक्षया संग्रहे तत्त्वानां सङ्गतक्रमस्य सन्दर्भं दातुं शक्नोति ।

स्लाइस् एकप्रकारः सन्दर्भः अतः तस्य स्वामित्वं नास्ति ।

alt
alt

Rust इत्यस्मिन् स्लाइस् इति दृश्यं यत् सरणीतः अन्यस्मात् स्लाइस् वा सङ्गततत्त्वानां क्रमं सन्दर्भयति । स्लाइस् निर्मातुं भवद्भिः स्लाइस् इत्यस्य आरम्भः अन्त्यस्थानं च निर्दिष्टव्यं (अन्तस्थानस्य अनुक्रमणिकां न समाविष्टम्) ।सरणीयांa in यदि प्राप्तुम् इच्छसि[2, 3, 4] अस्य स्लाइस् कृते भवद्भिः अनुक्रमणिका 1 तः आरभ्य अनुक्रमणिका 4 (सूचकाङ्कं 4 विहाय) समाप्तं कर्तव्यम् ।

अत्र भवतः परीक्षणसङ्केतः कथं निश्चयः करणीयः इति दर्शितम् अस्ति ।

#[test]
fn slice_out_of_array() {
    let a = [12345];

    // 从索引 1 开始,到索引 4 结束的切片
    let nice_slice = &a[1..4];

    assert_eq!([234], nice_slice);
}
  • 1

अस्मिन् उदाहरणे .&a[1..4] तः एकं सरणी निर्मितम्a स्लाइस् अनुक्रमणिका 1 आरभ्य अनुक्रमणिका 3 समाप्तं भवति, यतः Rust इत्यस्य स्लाइसिंग् वाक्यविन्यासः वाम-निमीलितः दक्षिण-उद्घाटितः च अन्तरालः (आरम्भः सहितः, परन्तु अन्तः न) अस्तिअतःnice_slice अस्मिन् सरणी अस्तिa मध्यं[2, 3, 4]

कोड सम्पादनस्य लूप् प्रयोगं आरभ्य आदेशपङ्क्तौ rustlings watch इति प्रविष्टं कुर्वन्तु

alt

स्वामित्वं अवगत्य

स्वामित्वं रस्ट् इत्यस्य सर्वाधिकं विशिष्टं विशेषता अस्ति तथा च शेषभाषायाः कृते गहनाः प्रभावाः सन्ति ।

एतत् रस्ट् इत्यस्मै कचरासंग्रहकस्य आवश्यकतां विना स्मृतिसुरक्षायाः गारण्टीं कर्तुं समर्थं करोति

स्वामित्वं किम् ?

alt

स्वामित्वनियमाः प्रथमं स्वामित्वनियमान् अवलोकयामः। एतान् नियमान् मनसि धारयन्तु यदा वयं तान् द्योतयन्तः उदाहरणानि कार्यं कुर्मः।

  • Rust इत्यस्मिन् प्रत्येकस्य मूल्यस्य स्वामी भवति ।
  • एकस्मिन् समये एकः एव स्वामिः भवितुम् अर्हति ।
  • यदा स्वामिना व्याप्तेः बहिः गच्छति तदा मूल्यं पातयिष्यते

alt
alt

कोड नमूना स्वयं सम्यक् अस्ति तथा च Rust इत्यस्मिन् स्वामित्वस्य प्रतिलिपिकरणस्य च अवधारणाः प्रदर्शयति । तथापि यदि भवान् सुनिश्चितं कर्तुम् इच्छति यत् भवतां कोडः संकलितः चाल्यते च, तथा च भवान् केचन सम्भाव्यसुधाराः अथवा सुधाराः सम्बोधयितुम् इच्छति, तर्हि अत्र केचन सुझावाः सन्ति:

  1. सुनिश्चितं कुरुत takes_ownership तथाmakes_copy function inmain पूर्वं परिभाषितं कार्यं, यतः Rust इत्यस्मिन् फंक्शन्स् प्रथमं घोषितं कृत्वा ततः उपयोक्तुं आवश्यकम् अस्ति ।

  2. टिप्पण्यानि योजयन्तु, किमर्थमिति व्याख्यातव्यम् s अस्तिtakes_ownership आहूतस्य अनन्तरं प्रयोक्तुं न शक्यते, तथा चx अस्तिmakes_copy आहूतस्य अनन्तरम् अपि तस्य उपयोगः कर्तुं शक्यते ।

  3. योजयतु main function return type, यद्यपि सरलकार्यक्रमेषु एतत् आवश्यकं नास्ति तथापि एतत् उत्तमः प्रोग्रामिंग् अभ्यासः अस्ति ।

  4. Rust’s formatting tools इत्यस्य उपयोगेन,उदाहरणतया rustfmt, कोडं स्वच्छं स्थापयितुं ।

उपर्युक्तसूचनानाम् आधारेण परिवर्तितः कोडः अत्र अस्ति ।

fn takes_ownership(some_string: String) { // 函数定义在 main 之前
    println!("{}", some_string);
// some_string 的作用域结束,调用 Drop

fn makes_copy(some_integer: i32) { // 函数定义在 main 之前
    println!("{}", some_integer);
// some_integer 的作用域结束,没有调用 Drop,因为 i32 是 Copy 类型

fn main() -> () { // 明确 main 函数的返回类型为 ()
    let s = String::from("hello");  // s 拥有 "hello" 的所有权

    takes_ownership(s);             // s 的值移动到 takes_ownership 函数

    // 下面的代码尝试使用 s 将会导致编译错误,因为 s 的值已经移动
    // let len = s.len(); // 错误:s 已移动

    let x = 5;                      // x 包含值 5

    makes_copy(x);                  // x 的值被复制到 makes_copy 函数
                                    // x 仍然有效,因为 i32 是 Copy 类型

    // x 仍然可以使用
    println!("x is {}", x);
}
  • 1

अस्मिन् संशोधिते संस्करणे वयं योजितवन्तः main function return type(),इति भावः main फंक्शन् कोऽपि मूल्यं न ददाति ।अपि च, किमर्थम् इति व्याख्यातुं टिप्पण्याः योजिताः भवन्तिs अस्तिtakes_ownership आहूतस्य अनन्तरं प्रयोक्तुं न शक्यते, तथा चx अस्तिmakes_copy अद्यापि आह्वानं कृत्वा वैधम्।अतिरिक्तरूपेण वयं प्रयत्नाः दर्शयामःtakes_ownership आह्वानस्य अनन्तरं उपयोगं कुर्वन्तुs उदाहरणानि येन संकलनदोषाः भवन्ति, तथा चx अस्तिmakes_copy उदाहरणानि ये आह्वानानन्तरं अपि उपयोक्तुं शक्यन्ते।

सदिशः

सदिशः सर्वाधिकं प्रयुक्तेषु Rust दत्तांशसंरचनेषु अन्यतमः अस्ति ।

अन्येषु प्रोग्रामिंगभाषासु, ते केवलं Arrays इति उच्यन्ते, परन्तु यतः Rust किञ्चित् निम्नस्तरस्य कार्यं करोति, Rust मध्ये एकः सरणी स्टैक् मध्ये संगृहीतः भवति (अर्थात् सः वर्धयितुं वा संकुचितुं वा न शक्नोति, आकारः च ज्ञातव्यः संकलनसमये), तथा च एकः Vector राशौ संगृह्यते (यत्र एते प्रतिबन्धाः न प्रवर्तन्ते) ।

सदिशः पुस्तके किञ्चित् पश्चात् अध्यायः अस्ति, परन्तु वयं मन्यामहे यत् ते किञ्चित् पूर्वं तेषां विषये वक्तुं पर्याप्तं उपयोगिनो भवन्ति। अन्येषां उपयोगीनां दत्तांशसंरचनानां, hash maps इत्यस्य विषये वयं पश्चात् वदामः ।

अधिक जानकारी

alt vec_map कार्यं स्वीकुर्वितुं कVec<i32> type (अर्थात् ३२-बिट् पूर्णाङ्कयुक्तः सदिशः), ततः नूतनं प्रत्यागच्छतिVec<i32>, अस्मिन् नूतने सदिशे प्रत्येकं तत्त्वं मूलसदिशस्य तत्सम्बद्धस्य तत्त्वस्य द्विगुणं भवति ।

विशेषतः, २.vec_map कार्येmap तथाcollect विधिः एवं कार्यं करोति- १.

  1. **v.iter()**: एषा विधिः एकं पुनरावर्तकं निर्माति यत् भ्रमति v सदिशस्य प्रत्येकं तत्त्वं ।iter विधिना प्रत्यागतः पुनरावर्तकः सदिशे स्थितानां तत्त्वानां अपरिवर्तनीयं सन्दर्भं प्रदाति ।

  2. **.map(|element| { element * 2 })**:map विधिः एकं समापनम् (अनामकार्यं) स्वीकुर्वति, अस्मिन् सन्दर्भे समापनम् एकं पैरामीटर् स्वीकुर्वतिelement (सदिशे कस्यचित् तत्त्वस्य अपरिवर्तनीयः सन्दर्भः) ततः अस्य तत्त्वस्य मूल्यं 2 गुणितं प्रत्यागच्छति ।बन्दीकरणस्य अन्तः परिचालनम्element * 2 वस्तुतः, भवान् सन्दर्भेण सूचितं दत्तांशं (via* operator) तथा गुणनक्रियाः कुर्वन्ति ।

  3. **.collect()**:map विधिः एकं आलस्यं पुनरावर्तकं प्रत्यागच्छति यत् एकैकं निमीलने क्रियाः प्रयोजयति, परन्तु तत्क्षणं परिणामान् न संग्रहयति ।collect एतानि पारयितुं विधिः इति उच्यतेmap संसाधिततत्त्वानि नूतनरूपेण सङ्गृह्यन्तेVec<i32> सदिशे ।

उपयुञ्जताम्‌ map तथाcollect लाभः अस्ति यत् ते भवन्तं संग्रहे प्रत्येकं तत्त्वे घोषणात्मकरूपेण क्रियाः कर्तुं शक्नुवन्ति तथा च स्पष्टपाशलेखनस्य आवश्यकतां विना परिणामान् नूतनसङ्ग्रहे संग्रहयितुं शक्नुवन्ति एवं कोडः अधिकं संक्षिप्तः Rust शैल्या सह अधिकं सङ्गतः च भवति ।

अत्र कथं प्रयोगः करणीयः इति vec_map कार्यस्य उदाहरणम् : १.

fn main() {
    let original_vec = vec![1234];
    let doubled_vec = vec_map(&original_vec);
    println!("{:?}", doubled_vec); // 这将打印:[2, 4, 6, 8]
}
  • 1

अस्मिन् उदाहरणे .vec_map अधिग्रहणं कुर्वन्तुoriginal_vec reference, नूतनं सदिशं निर्मायdoubled_vec, यस्मिन् मूलसदिशस्य प्रत्येकस्य तत्त्वस्य द्विगुणं मूल्यं भवति, तत् च मुद्रयति ।

चाल शब्दार्थ

एते अभ्यासाः तः अनुकूलिताः सन्ति pnkfelix इतिस्य जंग ट्यूटोरियल -- धन्यवादः फेलिक्सः !!!

अधिक जानकारी

अस्य खण्डस्य कृते पुस्तकस्य लिङ्काः विशेषतया महत्त्वपूर्णाः सन्ति ।

चाल_शब्दार्थ1.rs

alt

चाल_शब्दार्थ2.rs

alt
alt

// move_semantics5.rs

alt

Rust इत्यस्मिन् परिवर्तनीयसन्दर्भाणां नियमः अस्ति : कस्मिन् अपि समये, भवतः किमपि संख्यायां अपरिवर्तनीयसन्दर्भाः, अथवा अधिकतया एकः परिवर्तनीयः सन्दर्भः भवितुम् अर्हति । एषः नियमः स्मृतिसुरक्षां सुनिश्चितं करोति, दत्तांशदौडं च निवारयति ।

प्रदत्तसङ्केते समस्या अस्ति : १.main फंक्शन् द्वौ परिवर्तनीयसन्दर्भौ निर्मातुं प्रयतितवान्y तथाz, उभयम् अपि एकमेव चरं दर्शयति x . एतत् न अनुमतं यतोहि Rust इत्यस्य ऋणग्रहणनियमाः एकस्मिन् व्याप्ते एकस्यैव चरस्य बहुविधं परिवर्तनीयसन्दर्भं न अनुमन्यन्ते । अत एव कोडः संकलनं न करोति ।

एतस्याः समस्यायाः निवारणाय भवद्भिः सुनिश्चितं कर्तव्यं यत् कस्मिन् अपि समये केवलम् एकः परिवर्तनीयः सन्दर्भः अस्ति । अत्र नियतसङ्केतः अस्ति : १.

fn main() {
    let mut x = 100;
    {
        let y = &mut x;
        *y += 100// 此时 x 的值变为 200
    } // 'y' 的作用域结束,可变引用被销毁
    {
        let z = &mut x; // 可以创建新的可变引用,因为 'y' 已经不存在了
        *z += 1000// 此时 x 的值变为 1200
    } // 'z' 的作用域结束,可变引用被销毁
    assert_eq!(x, 1200); // 断言 x 的值是 1200,这是正确的
}
  • 1

अस्मिन् नियतसंस्करणे वयं आन्तरिकव्याप्तिम् निर्माय कदापि एकः एव परिवर्तनीयः सन्दर्भः अस्ति इति सुनिश्चितं कुर्मः ।प्रथमं वयं सृष्टवन्तःy व्याप्तिः, तस्मिन् शल्यक्रिया क्रियते, ततः अयं व्याप्तिः समाप्तः भवति,y न पुनः वैधम्।तदनन्तरं वयं सृष्टवन्तःz व्याप्तिः, पुनः कृतेx संचालनं कुर्वन्तु। एतेन Rust इत्यस्य ऋणग्रहणनियमानाम् अनुसरणं भवति येन कोडः अपेक्षितरूपेण संकलितः चालितः च भवति ।

alt
alt
alt

एषः संकलनदोषसन्देशः Rust कोड् मध्ये जीवनचक्रस्य समस्यां सूचयति ।समस्या अस्तिstring_uppercase फंक्शन् इत्यस्य कार्यान्वयने, सन्दर्भे अस्थायी मूल्यं नियुक्तुं प्रयतते, यत् अनुमतं नास्ति ।

अत्र कोडस्य रेखा अस्ति या भ्रष्टा भवति :

data = &data.to_uppercase();
  • 1

अस्मिन् कोडपङ्क्तौ .data.to_uppercase() निर्मितः कString एकः नूतनः उदाहरणःdata ऋणं कृतवान् ।तथापि, अस्य अस्थायीमूल्ये सन्दर्भं नियुक्तं कर्तुं प्रयतध्वम्data अवैधं यतः कथनस्य अन्ते अस्थायी मूल्यं तत्क्षणमेव नष्टं भवति, तथा चdata अस्थायीमूल्यानां अपेक्षया दीर्घकालं यावत् आयुः आवश्यकः ।

एतस्याः समस्यायाः निवारणाय अस्माभिः परिवर्तनं कर्तव्यम् string_uppercase एकं कार्यं यत् परिवर्तनीयसन्दर्भं स्वीकृत्य तया सन्दर्भेण सूचितदत्तांशस्य उपरि प्रत्यक्षतया आह्वयतिmake_uppercase() पुनः नियुक्तिं कर्तुं प्रयत्नस्य स्थाने विधिः । अत्र नियतसङ्केतः अस्ति : १.

fn string_uppercase(data: &mut String) {
    data.make_uppercase(); // 直接在 data 上调用 make_uppercase 方法

    println!("{}", data);
}
  • 1

अस्मिन् नियतसंस्करणे वयं निष्कासितवन्तः mut data: &String मध्यंmut,यतः data पूर्वमेव परिवर्तनीयः सन्दर्भः।अथ वयं प्रत्यक्षतयाdata आह्वानं कुर्वन्तुmake_uppercase(), अतः अस्थायीमूल्यानां समस्या न भविष्यति ।make_uppercase() विधिः परिवर्तिता भविष्यतिdata सन्दर्भः दर्शयतिString नूतनं न निर्माय उदाहरणम्String

अपि,main परिवर्तनीयसन्दर्भं पारयितुं कार्यस्य अन्तः आह्वानस्य अपि तदनुसारं अद्यतनीकरणस्य आवश्यकता भवति:

fn main() {
    let mut data = "Rust is great!".to_string();

    string_uppercase(&mut data); // 传递一个可变引用
    println!("{}", data); // 打印修改后的字符串
}
  • 1

अधुना,string_uppercase कार्यं स्वीकुर्वतिdata परिवर्तनशीलः सन्दर्भः, प्रत्यक्षतया परिवर्तयन्तु, तथा चmain कार्येdata परिवर्तनशीलः अस्ति, भवितुम् अर्हति चstring_uppercase परिवर्तितम् । एवं कोडः यथा अपेक्षितं संकलितः कार्यं च करोति ।

alt
alt
alt
/**
【昵称】小王同学
【坐标】山东
【自我介绍】
    1. 高级后端工程师,擅长c++并发编程。
    2. 专注分布式存储,分布式数据库。
    3. 时间的践行者,立志成为一名讲师。
【我的成绩】
    1.  为了走出农村,2次高考
         一次考研失败,
         遇挫之后不知道干什么,开启被动之旅。
    2. 为了找到合适工作,   
        深入研究c++书籍和leetcode 200题目
    3. 为了提高项目能力,参与开源项目建设。
    4. 为了把简单事情说清楚/要干啥
        按照《只管去做》,《福格行为模型>>方法。
        纸上得来终觉浅,绝知此事要躬行
        做一个践行者。
【我能提供】
    1.  后端程序员的简历优化+就业辅导+职业规划
    2.  全栈工程师(c++,rust,go,python )项目开发
    3. 一年践行12本书践行记录。
【希望一起解决什么,开启破圈之旅】
    1. 交接更多朋友,抱团取暖。
        寻找意义本身就更加有意义。
    2. 无法做整个系统,聚焦一个模块
         道可道也,非恒道也 
         名可名也,非恒名也。
         无名 万物之始也
         有名 万物之母也
         别想太多,只管去做,躬身入局
     
链接我: # + v(github):watchpoints   
        #众号:后端开发成长指南
**/
  • 1

अयं लेखः लिखितः अस्ति mdniceबहुमञ्च प्रकाशन