মরিচা কাঠামোতে ভেরিয়েবল সূচনা করার জন্য কি আরও দ্রুত / খাটো উপায় আছে?


107

নিম্নলিখিত উদাহরণে, আমি ক্ষেত্রগুলির ঘোষণায় কাঠামোর প্রতিটি ক্ষেত্রের জন্য একটি মান নির্ধারণ করতে অনেক বেশি পছন্দ করব। বিকল্পভাবে, ক্ষেত্রগুলিতে একটি মান নির্ধারণের জন্য এটি প্রতিটি ক্ষেত্রের জন্য কার্যকরভাবে একটি অতিরিক্ত বিবৃতি গ্রহণ করে। আমি যা করতে সক্ষম হতে চাই তা হ'ল স্ট্রাক্টটি ইনস্ট্যান্ট হয়ে গেলে ডিফল্ট মান নির্ধারণ করে।

এটি করার আরও একটি সুসংগত উপায় আছে?

struct cParams {
    iInsertMax: i64,
    iUpdateMax: i64,
    iDeleteMax: i64,
    iInstanceMax: i64,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

impl cParams {
    fn new() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

উত্তর:


171

আপনি Defaultবৈশিষ্ট্য প্রয়োগ করে আপনার কাঠামোর জন্য ডিফল্ট মান সরবরাহ করতে পারেন । defaultফাংশন আপনার বর্তমান মত দেখাবে newফাংশন:

impl Default for cParams {
    fn default() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

তারপরে আপনি কেবল অ-ডিফল্ট মান দিয়ে স্ট্রাক্টটি ইনস্ট্যান্ট করতে পারেন:

let p = cParams { iInsertMax: 10, ..Default::default() };

আপনার ডেটা স্ট্রাকচারে কিছুটা ছোটখাটো পরিবর্তন এসেছে, আপনি স্বয়ংক্রিয়ভাবে প্রাপ্ত ডিফল্ট প্রয়োগের সুযোগ নিতে পারেন। আপনি যদি #[derive(Default)]কোনও ডেটা কাঠামো ব্যবহার করেন তবে সংকলক স্বয়ংক্রিয়ভাবে আপনার জন্য একটি ডিফল্ট ফাংশন তৈরি করবে যা প্রতিটি ক্ষেত্রকে তার ডিফল্ট মান দিয়ে পূর্ণ করে। ডিফল্ট বুলিয়ান মানটি মিথ্যা, ডিফল্ট অবিচ্ছেদ্য মান 0 হয়।

আপনি পূর্ণসংখ্যার ক্ষেত্রগুলি -1 ডিফল্টরূপে করতে চান বলে একটি পূর্ণসংখ্যার ডিফল্ট মান 0 হওয়া এখানে একটি সমস্যা। আপনি একটি নতুন ধরণের সংজ্ঞা দিতে পারেন যা -1 এর একটি ডিফল্ট মান প্রয়োগ করে এবং i64এটি আপনার স্ট্রাক্টের পরিবর্তে ব্যবহার করতে পারে । (আমি এটি পরীক্ষা করিনি, তবে এটি কাজ করা উচিত)।

তবে আমি আপনার ডেটা কাঠামোটি সামান্য পরিবর্তন করার Option<i64>পরিবর্তে ব্যবহার করার পরামর্শ দেব i64। আমি আপনার কোডের প্রসঙ্গটি জানি না, তবে দেখে মনে হচ্ছে আপনি "অসীম", বা "সর্বাধিক কোনও নেই" উপস্থাপিত করার জন্য -1 এর বিশেষ মানটি ব্যবহার করছেন। মরচে, আমরা Optionএকটি বিকল্পভাবে উপস্থিত মান উপস্থাপন করতে ব্যবহার করি । -1 হ্যাকের দরকার নেই। একটি বিকল্প হয় হয় Noneবা Some(x)এক্স i64এখানে আপনার হতে পারে যেখানে হতে পারে । এটি এমনকি স্বাক্ষরবিহীন পূর্ণসংখ্যাও হতে পারে যদি -1 কেবলমাত্র নেতিবাচক মান হত। ডিফল্ট Optionমানটি Noneতাই প্রস্তাবিত পরিবর্তনের সাথে আপনার কোডটি দেখতে দেখতে এটি দেখতে পারে:

#[derive(Default)]
struct cParams {
    iInsertMax: Option<u64>,
    iUpdateMax: Option<u64>,
    iDeleteMax: Option<u64>,
    iInstanceMax: Option<u64>,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

let p = cParams { iInsertMax: Some(10), ..Default::default() };

4
ধন্যবাদ, আমি দ্রুত পড়লাম, তবে আমি আরও ভাল করে বুঝতে পারি। "প্রাকৃতিক" ডিফল্ট যে কোনও ভাষা ব্যবহার করে যেমন আমি বিশ্বাস করি শূন্য, মিথ্যা, "" ইত্যাদি, আমার উপযুক্ত হবে। আমি বুঝতে পারি যে আমার ছোট "সমস্যা" সমাধানের চেয়ে আরও বিস্তৃত প্রভাব রয়েছে। বলার ক্ষমতা যেমন। "আইভাল: আই =64 = 0", আমার আরও বিস্তৃত চাহিদা সমাধান করবে, তবে আমার ধারণা এটি ঘটবে না। "# [ডেরাইভিং (ডিফল্ট)]" আমার বেশিরভাগ চাওয়াগুলি সমাধান করা উচিত। আমি নিশ্চিত না যে কেন আমি আমার পরীক্ষার প্রোগ্রামে -1 ব্যবহার করেছি, তবে এটির প্রয়োজন নেই ()তিহাসিক)। ক্ষেত্রটি নির্ধারিত যেখানে সিটুতে একটি মান নির্ধারণ করতে সক্ষম হওয়া এটি খুব দরকারী (আইএমএইচও) হবে।
ব্রায়ান ওহ

9
@ ব্রায়ানহহ, স্পর্শকাতরভাবে, "কাঠামোগত ক্ষেত্রগুলির জন্য ডিফল্ট মান" (যেমন এর মতো কিছু struct Foo { val: i64 = 0 }) প্রস্তাব করা হয়েছে এবং এটি পরবর্তী সংস্করণগুলিতে উপস্থিত হতে পারে।
huon

এটি যদি আইএমও - "স্ট্রাক্ট ফু {...." প্রয়োগ করা হয় তবে ভাল হবে। আমার প্রশ্নের লিখিত হিসাবে এবং ডিফল্টরূপে স্ট্রাকটি ব্যবহার করে আমি আপনার পরামর্শ অনুযায়ী পরিবর্তনগুলি করেছি। এটি অবশ্যই আমার চেয়ে বেশি উপযুক্ত এবং এটি আরও সংক্ষিপ্ত। সিনট্যাক্সের সাথে অপরিচিত হওয়ায় আমার একটি ছোটখাটো সমস্যা হ'ল সমস্ত ডিফল্টের সিনট্যাক্সটি জানা ছিল না। IE: আমি "= cParams {iInsertMax: 10, .. Default :: default ()};" ব্যবহার করেছি, তবে আমি আসলে "iInstanceMax" কেও ডিফল্ট হতে চাই। আইএমও কাঠামোর অংশ হওয়া "# [ডেরাইভিং (ডিফল্ট)]" এর পক্ষে পছন্দনীয় তবে আমি ধারণা করি বিকল্প সংকলকটি আরও ভাল মানায়।
ব্রায়ান ওহ

4
তার জন্য অনেক ধন্যবাদ। আইএমএইচও ডিফল্ট হওয়া উচিত। আইই। আমি মনে করি না যে এটি ডিফল্ট: ডিফল্ট ইত্যাদি নির্দিষ্ট করা দরকার etc. ইত্যাদি I আমি আরও মনে করি যে ক্ষেত্রগুলি যেখানে সংজ্ঞাযুক্ত সেখানে কোনও মান নির্ধারণ করতে সক্ষম হওয়া উচিত। এটি কেবলমাত্র আমার সাধারণ দৃষ্টিকোণ থেকে এবং আমি বুঝতে পারি যে মরিচা নিরাপদ থাকার জন্য ডিজাইন করা হয়েছে, এবং আমার চেয়ে আরও বিস্তৃত দৃষ্টিকোণ রয়েছে। যখন কেউ ভাষা শিখছে (বা কমপক্ষে আমি) তখন বর্তমান প্রয়োগটি কিছুটা জটিল বলে মনে হচ্ছে। মরিচা কোনও সহজ ভাষা আইএমএইচও নয় এবং এটিকে সহজতর করার জন্য কমপক্ষে আমার পক্ষে আরও ভালতর করা সম্ভব।
ব্রায়ান ওহ

4
Defaultস্ট্রাক্টের জন্য বাস্তবায়ন করার সময় কি সমস্ত ক্ষেত্রের জন্য খেলাপি সংজ্ঞা দেওয়া প্রয়োজন?
ম্যাথু স্টিভেনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.