আমার একটি বৈশিষ্ট্য রয়েছে যা সম্পর্কিত কোনও ধরণের ডিজাইরিজাইজ করার জন্য একটি ফাংশন রাখে। তবে সম্পর্কিত সম্পর্কিতটির জন্য কলার সিদ্ধান্ত নেয় এমন একটি আজীবন প্রয়োজন, সুতরাং আমার একটি পৃথক বৈশিষ্ট্য রয়েছে যা আমি উচ্চতর-র্যাঙ্কযুক্ত বৈশিষ্ট্যের জন্য আবদ্ধ থাকি, যাতে এটি কোনও জীবনকালের জন্য বিশৃঙ্খলাবদ্ধ হতে পারে।
আমাকে এমন একটি ক্লোজার ব্যবহার করতে হবে যা এই সম্পর্কিত ধরণটি দেয়।
এটি করার জন্য আমার কাছে নিম্নলিখিত কোড রয়েছে:
#![allow(unreachable_code)]
use std::marker::PhantomData;
trait Endpoint: for<'a> EndpointBody<'a> {}
trait EndpointBody<'a> {
type Out: 'a;
fn serialize(body: &Self::Out) -> Vec<u8>;
fn deserialize(raw_body: &'a [u8]) -> Self::Out;
}
// /////////////////////////////////////////////////////////
/// Trait object compatible handler
trait Handler {
fn execute(&self, raw_body: &[u8]) -> Vec<u8>;
}
/// Wraps a function for an endpoint, convertint it to a Handler
struct FnHandler<EP, F>
where
EP: Endpoint,
F: 'static + for<'a> Fn(&'a [u8]) -> <EP as EndpointBody<'a>>::Out,
{
func: F,
_ph: PhantomData<EP>,
}
impl<EP, F> FnHandler<EP, F>
where
EP: Endpoint,
F: 'static + for<'a> Fn(&'a [u8]) -> <EP as EndpointBody<'a>>::Out,
{
pub fn new(func: F) -> Self {
Self {
func,
_ph: PhantomData,
}
}
}
impl<EP, F> Handler for FnHandler<EP, F>
where
EP: Endpoint,
F: 'static + for<'a> Fn(&'a [u8]) -> <EP as EndpointBody<'a>>::Out,
{
fn execute(&self, in_raw_body: &[u8]) -> Vec<u8> {
let body = (self.func)(in_raw_body);
let serialized_body = unimplemented!();
return serialized_body;
}
}
// /////////////////////////////////////////////////////////
/// Collection of handlers
struct Handlers(Vec<Box<dyn Handler>>);
impl Handlers {
pub fn new() -> Self {
Self(vec![])
}
pub fn handle<EP: 'static, F>(&mut self, func: F)
where
EP: Endpoint,
F: 'static + for<'a> Fn(&'a [u8]) -> <EP as EndpointBody<'a>>::Out,
{
self.0.push(Box::new(FnHandler::<EP, F>::new(func)));
}
}
// /////////////////////////////////////////////////////////
struct MyEndpoint;
struct MyEndpointBody<'a> {
pub string: &'a str,
}
impl Endpoint for MyEndpoint {}
impl<'a> EndpointBody<'a> for MyEndpoint {
type Out = MyEndpointBody<'a>;
fn serialize(body: &Self::Out) -> Vec<u8> {
unimplemented!()
}
fn deserialize(raw_body: &'a [u8]) -> Self::Out {
unimplemented!()
}
}
// /////////////////////////////////////////////////////////
fn main() {
let mut handlers = Handlers::new();
handlers.handle::<MyEndpoint, _>(|_body| MyEndpointBody {
string: "test string",
});
handlers.0[1].execute(&[]);
}
আমি মনে করি এটি কাজ করা উচিত, তবে যখন আমি এটি যাচাই করি তখন আমি একটি টাইপ ত্রুটি পাই:
error[E0271]: type mismatch resolving `for<'a> <[closure@src/main.rs:92:38: 94:6] as std::ops::FnOnce<(&'a [u8],)>>::Output == <MyEndpoint as EndpointBody<'a>>::Out`
--> src/main.rs:92:14
|
92 | handlers.handle::<MyEndpoint, _>(|_body| MyEndpointBody {
| ^^^^^^ expected struct `MyEndpointBody`, found associated type
|
= note: expected struct `MyEndpointBody<'_>`
found associated type `<MyEndpoint as EndpointBody<'_>>::Out`
= note: consider constraining the associated type `<MyEndpoint as EndpointBody<'_>>::Out` to `MyEndpointBody<'_>`
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
এটি বিভ্রান্তিকর কারণ MyEndpoint::Out
এটি একটি MyEndpointBody
, যা আমি বন্ধ থেকে ফিরে আসছি, তবে মরচে মনে হয় না তারা একই ধরণের। আমি এটি অনুমান করছি কারণ মরিচ MyEndpointBody
টাইপের জন্য বেমানান বেনামে জীবনকাল বেছে নিয়েছে , তবে কীভাবে এটি ঠিক করতে হয় তা আমি জানি না।
আমি এই কোডটি কীভাবে কাজ করতে পারি যাতে আমি এইচআরটিবি সম্পর্কিত ধরণের সাথে ক্লোজারটি ব্যবহার করতে পারি?
Fn
প্যারামিটারের একটি নির্বিচার জীবনকাল হওয়া দরকার। কিন্তু এখানে এই জীবদ্দশায় নির্ভরশীল হয়ে যায় এবং এটা এই ধরনের কোনো ব্যবহারের অসম্ভব চেক করুন তোলে: play.rust-lang.org/...