মরিচায় একটি "মৌলিক ধরণ" কী?


37

কোথাও আমি "মৌলিক ধরণ" (এবং এর বৈশিষ্ট্য #[fundamental]) শব্দটি তুলেছি এবং এখনই আমি এ সম্পর্কে আরও জানতে চাইছি। আমি অস্পষ্টভাবে মনে করি এটি কিছু পরিস্থিতিতে সুসংগত নিয়ম শিথিল করা সম্পর্কে। এবং আমি মনে করি রেফারেন্স টাইপগুলি এ জাতীয় মৌলিক প্রকার।

দুর্ভাগ্যক্রমে, ওয়েব অনুসন্ধান আমাকে খুব বেশি দূর এনে দেয় না। মরিচা রেফারেন্সটি এর উল্লেখ করে না (যতদূর আমি দেখতে পাচ্ছি)। আমি শুধু পাওয়া tuples মৌলিক ধরনের নির্মাণ সম্পর্কে একটি বিষয় এবং জন্য RFC যে অ্যাট্রিবিউট চালু । তবে, আরএফসির মৌলিক প্রকারগুলি সম্পর্কে একটি একক অনুচ্ছেদ রয়েছে:

  • একটি #[fundamental]ধরণ Fooএমন একটি যেখানে কম্বল ইমপ্লের উপর প্রয়োগ Fooকরা একটি ব্রেকিং পরিবর্তন। বর্ণিত হিসাবে, &এবং &mutমৌলিক হয়। এই বৈশিষ্ট্যটি প্রয়োগ করা হবে Box, Box একইভাবে আচরণ করতে &এবং &mutসংহতি হিসাবে সম্মান করে।

আমি শব্দটি বোঝা মোটামুটি কঠিন মনে করি এবং এটি অনুভব করে যে মৌলিক ধরণের সম্পর্কে এই বিটটি বুঝতে আমার সম্পূর্ণ আরএফসি-র গভীর-জ্ঞান প্রয়োজন knowledge আমি আশা করছিলাম যে কেউ কিছুটা সহজ শর্তে মৌলিক ধরণের ব্যাখ্যা দিতে পারে (অবশ্যই খুব বেশি সরল না করে)। এই প্রশ্নটি জ্ঞানের একটি সহজ-সন্ধানকারী অংশ হিসাবেও কাজ করবে।

মৌলিক প্রকারগুলি বুঝতে, আমি এই প্রশ্নের উত্তর দিতে চাই (মূলত "তারা এমনকি কি?" প্রশ্নের পাশাপাশি অবশ্যই):

  • মৌলিক প্রকারগুলি কি অ-মৌলিকগুলির চেয়ে আরও বেশি কিছু করতে পারে?
  • আমি কি লাইব্রেরির লেখক হিসাবে আমার কিছু ধরণের চিহ্ন চিহ্নিত করে কোনও উপকার করতে পারি #[fundamental]?
  • মূল ভাষা বা স্ট্যান্ডার্ড লাইব্রেরি থেকে কোন প্রকারটি মৌলিক?

উত্তর:


34

সাধারণত, যদি কোনও লাইব্রেরির জেনেরিক প্রকার থাকে তবে Foo<T>ডাউন স্ট্রিম ক্রেটগুলি Tস্থানীয় কিছু প্রকারের হলেও এটিতে বৈশিষ্ট্যগুলি প্রয়োগ করতে পারে না । উদাহরণ স্বরূপ,

( crate_a)

struct Foo<T>(pub t: T)

( crate_b)

use crate_a::Foo;

struct Bar;

// This causes an error
impl Clone for Foo<Bar> {
    fn clone(&self) -> Self {
        Foo(Bar)
    }
}

একটি দৃground় উদাহরণের জন্য যা খেলার মাঠে কাজ করে (যা কোনও ত্রুটি দেয়),

use std::rc::Rc;

struct Bar;

// This causes an error
// error[E0117]: only traits defined in the current crate
// can be implemented for arbitrary types
impl Default for Rc<Bar> {
    fn default() -> Self {
        Rc::new(Bar)
    }
}

(খেলার মাঠ)


এটি সাধারণত ক্রেট লেখককে ডাউন স্ট্রিম ক্রেটগুলি না ভেঙে বৈশিষ্ট্যের প্রয়োগ (কম্বল) প্রয়োগ করতে সক্ষম করে। এটি ক্ষেত্রে দুর্দান্ত যে ক্ষেত্রে প্রাথমিকভাবে নির্দিষ্ট নয় যে কোনও ধরণের একটি নির্দিষ্ট বৈশিষ্ট্য প্রয়োগ করা উচিত, তবে এটি পরে স্পষ্ট হয়ে যায় যে এটি হওয়া উচিত। উদাহরণস্বরূপ, আমাদের কাছে এমন কিছু সংখ্যক টাইপ থাকতে পারে যা প্রাথমিকভাবে বৈশিষ্ট্যগুলি কার্যকর করে না num-traits। এই বৈশিষ্ট্যগুলি পরে কোনও ব্রেকিংয়ের প্রয়োজন ছাড়াই যুক্ত করা যেতে পারে।

তবে কিছু ক্ষেত্রে লাইব্রেরি লেখক চান যে ডাউন স্ট্রিম ক্রেটগুলি সেগুলি নিজেরাই বৈশিষ্ট্যগুলি প্রয়োগ করতে সক্ষম হবে। এটি এখানেই #[fundamental]বৈশিষ্ট্যটি আসে a কোনও প্রকারের উপর স্থাপন করা হলে, সেই ধরণের জন্য বর্তমানে প্রয়োগ করা হয়নি এমন কোনও বৈশিষ্ট্য কার্যকর করা হবে না (একটি ব্রেকিং পরিবর্তন ব্যতীত)। ফলস্বরূপ, ডাউন স্ট্রিম ক্রেটগুলি সেই ধরণের বৈশিষ্ট্যগুলি প্রয়োগ করতে পারে যতক্ষণ না কোনও টাইপ প্যারামিটার স্থানীয় থাকে (কোন ধরণের পরামিতিগুলির জন্য এটি গণনা করার জন্য কিছু জটিল নিয়ম রয়েছে)। যেহেতু মৌলিক ধরণ কোনও প্রদত্ত বৈশিষ্ট্য প্রয়োগ করে না, তাই এই বৈশিষ্ট্যটি সুসংগত সমস্যার কারণ ছাড়াই অবাধে প্রয়োগ করা যেতে পারে।

উদাহরণস্বরূপ, Box<T>চিহ্নিত করা হয়েছে #[fundamental], সুতরাং নিম্নলিখিত কোডটি ( Rc<T>উপরের সংস্করণের অনুরূপ ) কাজ করে। Box<T>বাস্তবায়ন করে না Default( Tপ্রয়োগ ব্যতীত Default) তাই আমরা ধরে নিতে পারি যে এটি ভবিষ্যতে হবে না কারণ Box<T>এটি মৌলিক। নোট করুন যে এর Defaultজন্য বাস্তবায়ন করার Barফলে সমস্যা দেখা দেয়, এরপরে Box<Bar>ইতিমধ্যে প্রয়োগগুলি Default

struct Bar;

impl Default for Box<Bar> {
    fn default() -> Self {
        Box::new(Bar)
    }
}

(খেলার মাঠ)


অন্যদিকে, বৈশিষ্ট্যগুলিও চিহ্নিত করা যেতে পারে #[fundamental]। এটি মৌলিক ধরণের দ্বৈত অর্থ রয়েছে। যদি বর্তমানে কোনও ধরণের কোনও মৌলিক বৈশিষ্ট্য প্রয়োগ না করে তবে ধরে নেওয়া যেতে পারে যে এই ধরণের ভবিষ্যতে এটি প্রয়োগ করা হবে না (আবারও, একটি ব্রেকিং পরিবর্তন বাদ দিয়ে)। বাস্তবে এটি কীভাবে ব্যবহৃত হয় তা আমি নিশ্চিত নই। FnMutকোডটিতে ( নীচে লিঙ্কযুক্ত) এটিকে নোটের সাথে মৌলিক হিসাবে চিহ্নিত করা হয়েছে যে এটি রেগেক্সের জন্য প্রয়োজন (কিছু সম্পর্কে &str: !FnMut)। এটি regexক্রেটে কোথায় ব্যবহার করা হয়েছে বা এটি অন্য কোথাও ব্যবহার করা হয়েছে তা আমি খুঁজে পাইনি ।

তত্ত্ব অনুসারে, যদি Addবৈশিষ্ট্যটি মৌলিক হিসাবে চিহ্নিত হয় (যা আলোচনা করা হয়েছে) এটি ইতিমধ্যে না থাকা জিনিসের মধ্যে সংযোজন প্রয়োগ করতে ব্যবহৃত হতে পারে। উদাহরণস্বরূপ, যোগ করা [MyNumericType; 3](পয়েন্টওয়াইস), যা নির্দিষ্ট পরিস্থিতিতে কার্যকর হতে পারে (অবশ্যই, [T; N]মৌলিক তৈরিও এটির অনুমতি দেয়)।


আদিম মৌলিক ধরনের হয় &T, &mut T(দেখুন এখানে সব জেনেরিক আদিম ধরনের বিক্ষোভের জন্য)। স্ট্যান্ডার্ড লাইব্রেরিতে Box<T>এবং Pin<T>এগুলিকে মৌলিক হিসাবে চিহ্নিত করা হয়।

মান লাইব্রেরিতে মৌলিক বৈশিষ্ট্যগুলো হয় Sized, Fn<T>, FnMut<T>, FnOnce<T>এবং Generator


নোট করুন যে #[fundamental]বৈশিষ্ট্যটি বর্তমানে অস্থির। ট্র্যাকিংয়ের সমস্যা # 29635


1
দুর্দান্ত উত্তর! আদিম ধরনের প্রসঙ্গে: মাত্র একটি থাবা জেনেরিক আদিম ধরনের হয়: &T, &mut T, *const T, *mut T, [T; N], [T], fnপয়েন্টার এবং tuples। এবং সেগুলি সব পরীক্ষা করে নিচ্ছেন (দয়া করে আমাকে বলুন যে এই কোডটি অর্থবোধ করে না তবে) মনে হয় যে উল্লেখগুলি একমাত্র মৌলিক আদিম ধরণের । মজাদার. আমি কেন অন্যগুলি বিশেষত কাঁচা পয়েন্টার নয় তা যুক্তি জানতে আগ্রহী। তবে এটি এই প্রশ্নের সুযোগ নয়, আমি অনুমান করি।
লুকাস কালবার্টোড

1
@ লুকাসক্যালবার্টডট আদিম ধরণের তথ্যের জন্য ধন্যবাদ। আমি আপনার পরীক্ষায় যোগ করেছি। রেফারেন্স বনাম পয়েন্টার সম্পর্কিত যুক্তি হিসাবে, আরএফসি পুল অনুরোধে এই মন্তব্যটি দেখুন check
এসসিপেলা 12

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