On Fri, Jul 26, 2024 at 01:43:38PM +0000, Benno Lossin wrote: [...] > >> > >> You can always get a `&T` from `ARef<T>`, since it implements `Deref`. > >> > > > > Yeah, but this is unrelated. I was talking about that API providers can > > decide whether they want to only provide a `raw_ptr` -> `ARef<Self>` if > > they don't need to provide a `raw_ptr` -> `&Self`. > > > >>> Overall, I feel like we don't necessarily make a preference between > >>> `->&Self` and `->ARef<Self>` functions here, since it's up to the users' > >>> design? > >> > >> I would argue that there should be a clear preference for functions > >> returning `&Self` when possible (ie there is a parameter that the > > > > If "possible" also means there's going to be `raw_ptr` -> `&Self` > > function (as the same publicity level) anyway, then agreed. In other > > words, if the users only need the `raw_ptr` -> `ARef<Self>` > > functionality, we don't want to force people to provide a `raw_ptr` -> > > `&Self` just because, right? > > I see... I am having a hard time coming up with an example where users > would exclusively want `ARef<Self>` though... What do you have in mind? > Normally types wrapped by `ARef` have `&self` methods. > Having `&self` methods doesn't mean the necessarity of a `raw_ptr` -> `&Self` function, for example, a `Foo` is wrapped as follow: struct Foo(Opaque<foo>); impl Foo { pub fn bar(&self) -> Bar { ... } pub unsafe fn get_foo(ptr: *mut foo) -> ARef<Foo> { ... } } in this case, the abstration provider may not want user to get a `raw_ptr` -> `&Self` function, so no need to have it. Regards, Boqun > Cheers, > Benno >