-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Unknown type from Lazy.lock() #2880
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
The impl<T, F: FnOnce() -> T> Deref for Lazy<T, F> and pub struct Lazy<T, F = fn() -> T> so the problem here is that we don't provide the built-in implementation of |
Is this hard to implement? I might have a go if you can point me in the right direction. |
It's not trivial, but it's very similar to the existing built-in implementation of the Edit: removed outdated instructions. The current situation is that these impls should be added on the Chalk side; see rust-lang/chalk#363. |
4493: Provide builtin impls of Fn traits for fn-pointers r=flodiebold a=hban Meant to be, but isn't actually a fix for #2880. Consider this snippet: ```rust use std::marker::PhantomData; use std::ops::Deref; struct Lazy<T, F/* = fn() -> T*/>(F, PhantomData<T>); impl<T, F> Lazy<T, F> { pub fn new(f: F) -> Lazy<T, F> { Lazy(f, PhantomData) } } impl<T, F: FnOnce() -> T> Deref for Lazy<T, F> { type Target = T; fn deref(&self) -> &T { todo!() } } fn test() { let lazy1: Lazy<u32, _> = Lazy::new(|| 0u32); let r1 = lazy1.to_string(); fn make_u32_fn() -> u32 { todo!() } let make_u32_fn_ptr: fn() -> u32 = make_u32_fn; let lazy2: Lazy<u32, _> = Lazy::new(make_u32_fn_ptr); let r2 = lazy2.to_string(); } ``` * On current master: * When type default is commented-out, `r1` is correctly inferred, `r2` in _{unknown}_. * When type default is not commented-out, both `r1` and `r2` are _{unknown}_. * With this PR: * When type default is commented-out, both `r1` and `r2` are correctly inferred. * When type default is not commented-out, both `r1` and `r2` are _{unknown}_. Well, it's a improvement at least. I guess this thing with type defaults is a different problem. I also tried add Fn impls for fn items, but wasn't successful. So this PR only adds those impls for fn pointers. Co-authored-by: Hrvoje Ban <[email protected]>
Fixed by #5124. |
I'm using
once_cell
'sLazy
type, like this:If I hover
STATE
then it does show the type asstatic STATE: Lazy<Arc<Mutex<State>>>
, however completion does not work (it doesn't offer.lock()
), and if you hovera
orlock
it says{unknown}
. I guess this is something to do with theDeref
trait.PS: This is with
master
from today (de24097).The text was updated successfully, but these errors were encountered: