Avatar
omochimetaru 2/28/2024 1:25 AM
transferring引数: Actorのinitの引数のように、渡された引数がその関数のリージョンに引き渡されるようになる。
1:27 AM
let ns = await withCheckedContinuation { continuation in Task { @MainActor in let ns = NonSendable() continuation.resume(returning: ns) } } Region based isolationの元でこれはエラーになるらしい。 ns が MainActor に居るので resume に渡せなくなる。 (edited)
1:28 AM
public struct CheckedContinuation<T, E: Error>: Sendable { public func resume(returning value: transferring T) } こうすることで、渡せるようになる。 ただし、渡した後ろでは使えなくなる。
1:29 AM
transferring返り値: 呼び出し側から見て、その値がリージョンから引き剥がされている扱いになる。関数自体の実装の正当性はチェックされる。 @MainActor struct S { let ns: NonSendable func getNonSendable() -> transferring NonSendable { return NonSendable() } } nonisolated func f(s: S) async { let ns = s.getNonSendable() // okay; 'ns' is in a disconnected region } (edited)
1:30 AM
↑これはtransferring指定がないと、sのMainActor regionから、let nsに渡せない。
1:34 AM
region based isolationが前提の元で、その挙動を調整するための機能って感じかなあ
1:34 AM
snapshot版じゃないと試せなそうだ