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