2 votes

Pourquoi une fonction a-t-elle un accès en écriture à long terme à tous ses paramètres d'entrée et de sortie ?

Selon le chapitre "Memory Safety" du guide du langage de programmation Swift (pour Swift 4.2), il y a une phrase "Une fonction a un accès en écriture à long terme à tous ses paramètres d'entrée et de sortie". https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html

J'ai créé un nouveau projet d'outil en ligne de commande pour le vérifier dans Xcode 10.1.

var stepSize = 1

func increment(_ number: inout Int) {
  print(stepSize)
}

increment(&stepSize)

Je m'attends à ce que la sortie soit 1, mais la sortie réelle est un journal d'incident "Accès simultanés à 0x100587430, mais la modification nécessite un accès exclusif".

Je sais qu'il s'agit d'un conflit concernant l'accès aux paramètres d'entrée-sortie, mais je ne sais pas pourquoi cela se produit. Pourquoi une fonction doit-elle avoir un accès en écriture à long terme à tous ses paramètres in-out ?

2voto

XAleXOwnZX Points 159

Un consommateur de cette API voit func increment(_ number: inout Int) mais pas la mise en œuvre. Il peut seulement supposer que increment(_:) effectue des écritures dans les paramètres, car il peut en principe.

Même si l'implémentation de la fonction ne fait pas actuellement d'écriture, la possibilité est là, donc le compilateur doit assumer le pire scénario. Imaginez qu'un code client soit autorisé à compiler contre cela, en le traitant comme s'il était en lecture seule (parce qu'à ce moment-là, cela peut être le cas). Que devrait-il arriver au code client quand quelqu'un ajoute number += 1 au corps de fonction ?

Cela revient à avoir une fonction qui déclare qu'elle peut throw dont l'implémentation réelle n'est pas throw . Le compilateur le traite toujours comme une erreur de lancement, et nécessite que l'erreur soit traitée avec une variante de try .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X