or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
Reading notes: Safe projections through pin types
https://blog.yoshuawuyts.com/safe-pin-projections-through-view-types/
tags:
reading-club
Questions
Eric: In first view types for projection example:
how do we know
timer
is pinned butcompleted
is not?Yosh: good question lol. I'm not sure? I think this was just me handwaving at: "what if that would just work". Later in the post we dive a bit more into details of how that could be made clear via syntax, etc.
Yosh: oh yeah, later on I talk how this could be made to work simply by inferring all
!Unpin
fields be pinned in the projection. But I don't actually end up advocating for that approach.Eric: This is answered later in the post.
Tyler: I think this syntax
would involve still using
self
, because the view syntax is only "describing the scope of the reference", while something likewould be a destructuring, allowing you to use
timer
andcompleted
directly in the method body. Is that right?Yosh: not sure, let's talk about it!
Yosh: I was thinking view types syntax was destructuring. Eric suggested that we use that syntax if we're already destructuring.
Tyler: Makes sense. Maybe view types syntax is destructuring. I like the idea of reusing the existing syntax in any case.
Eric: Can you destructure in an item function?
Nick: Yep
Nick: I think view types is reifying the restriction of which fields a borrow can capture (like fine-grained capture syntax). Explicitly not destructuring
Yosh: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=907cc42af2602d27f2598632f0bf1720 ??
Eric: Fixed version: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e9362200348d1ad4cc1834da3284afbe
Nick: Not too commonly used since you need to repeat the type name, except for tuples which is where I use it.
Tyler: Might be nice if we removed that restriction, e.g. by removing the need for the type annotation.
Yosh: key takeaways I want the async WG to have from this post:
Unpin
to be unsafe to implement.Tyler: How does pin_project handle this with
UnsafeUnpin
?Yosh: I believe it implements
UnsafeUnpin
anytime you use#[pin_project]
.Tyler: Marking it
unsafe
over an edition bound doesn't make sense to me since you wouldn't be able to project into a type that implements it from an old edition. Might needTyler: For fixing
Drop
, what code would the implicitly addedwhere Self: Unpin
bound break? There must be some code e.g. in pin-project that knows what it's doing...migrate to..
Eric: Easy to update pin_project specifically in a way that's compatible.
Tyler: Yeah, seems unlikely that we have that many impls like this floating around in the wild.
Yosh: My intuition as well.
Eric: Why is pinning
#[repr(packed)]
a problem?Yosh: the
std::pin
docs say so:Yosh: Would be nice to represent packed in the type system
Tyler: Compiler can check this as long as pin projection is built in.
Nick: Representing layout details like layout and alignment in the type system is going to be a lot.
Nick: I don't quite understand this doc.. why is e.g. transparently moving a value into a register a problem?
Yosh: When dropping things get reshuffled with
#[repr(packed)]
. Something else could live thereEric: The destructor of the moved field would be able to see that it moved.
Tyler: Rust gets to move your values around.. unless they're pinned.
Tyler: Pin seems to be reliably confusing. One reason why could be that it wraps the pointer instead of your value
Nick: The interaction with
Unpin
too.Pin
guarantees your type doesn't move unless it's notUnpin
— that sentence is hard to parse.Tyler: Yes!
Yosh: Ergonomics are a factor. It feels bad to use.
Eric: Seems more complicated than in other languages for some reason. In C# pinning is operational (used for FFI), whereas in Rust it's a declarative thing.
https://docs.microsoft.com/en-us/dotnet/api/system.memory-1.pin?view=net-6.0
(I don't actually have any experience with pinning in C#, I just know it exists.)
Eric: As soon as I've pinned something, the rest of my project is about how to get access to the pinned thing. At least until you realize that
pin_project
exists.Yosh: Whole journey of "why do I need
pin_project
". Hasn't meaningfully improved for new users.Yosh: mcyoung's talk
Tyler: Evidence for me that we probably need to continue having something like pin
Nick: People want self-referential structs but pinning is not a complete answer. You also can't spell the lifetime of a self-referential struct. Might need to be able to say that all references to your struct are pin, maybe you could do that with a special constructor?