Quelqu'un pourrait-il dire ce que dans http://dlang.org/phobos/std_algorithm.html#map Il y a assez de petites informations sur celui-ci: p> de ceci n'est pas clair, quoi Je peux ou ne peux pas faire avec ça. P> p> std.algorithm.map code> retourne? (Lien vers une page de documentation serait très apprécié)
Du message d'erreur, son résultat est de type
résultat code>
3 Réponses :
La gamme de résultats est "paresseuse", elle ne représente pas le résultat final.
Il peut être transformé en une matrice si vous importez STD.ARRAY et enveloppez-la comme: P>
auto result = std.algorithm.map!"a"(x); foreach (element; result) writeln(to!string(element));
@Jonathan, il fait référence à la notation de l'UFC
Ah ok. J'ai mal compris et pensais que le «DMD 2.059 ou la plus tard» faisait référence à la partie après cela. tableau code> devrait toujours avoir des parens dessus, cependant, il ne compilera pas avec
-Property code> (et
-Property code> est censé devenir le comportement normal Finalement, faire les parens nécessaires ici, car
tableau code> n'est pas une propriété).
Vous n'êtes pas censé savoir ou se soucier de ce que la plage renvoyée par Cependant, vous Utilisez uniquement Si vous devez créer un tableau à partir du résultat de la carte code> (ou depuis une autre plage), Ensuite, utilisez Si vous ne connaissez pas beaucoup de gammes, vous devriez probablement lire EDIT STRT>: P> Walter Bright a récemment écrit un article spécifiquement sur les types locaux à une fonction mais renvoyé par la fonction qui peut également aider à éclairer vous. Ils obtiennent même un nom cool: std.algorithm.map code> retourne au-delà du fait qu'il s'agit d'une gamme du même genre que celle transmise (avant, bidirectionnelle, aléatoire, etc. .). C'est ainsi avec la plupart des fonctions de plage. Ils renvoient presque toujours une nouvelle gamme qui enveloppe celle qui est transmise ou un même type de plage que possible (par exemple,
carte code> fait le premier;
trouve code> le dernier). Utilisez
auto code>:
carte code> est paresseux. Cela ne fait rien jusqu'à ce que vous soyez itérale dessus (il appelle ensuite la fonction donnée sur chaque code> avant code> de la plage sous-jacente). Il est plus efficace de cette façon (ainsi que pour permettre des gammes infinies). Le type de retour exact dépend du type de plage que vous avez transmis et est local à
cartographique code> afin que vous ne puissiez en créer un directement. Vous devez utiliser
auto code> pour déduire le type ou
typeof code> pour obtenir le type: p>
typeof code> lorsque vous avez besoin d'une variable que vous ne pouvez pas initialiser directement.
auto code> est presque toujours le moyen d'aller. p>
std.array.array code>
: P> Voldemort types dans d code>
. p> p>
"Vous n'êtes pas censé savoir ou se soucient". Merci de me corriger si je me trompe, mais si je ne devais pas savoir / soin, mon exemple devrait compiler
Je veux dire que vous ne devriez pas savoir ou ne vous souciez pas de savoir que tout ce que vous devez savoir est qu'il s'agisse d'une gamme du même genre que celle qui est passée. Le type exact est spécifique à carte code> et non quelque chose que vous allez utiliser. Vous venez d'utiliser
auto code> pour déduire le type et utilisez la plage avec l'API que les plages ont. Si vous voulez qu'il s'agisse d'un type spécifique, vous devez le convertir en ce type avec une fonction qui prend une plage et générera le type que vous souhaitez (par exemple STD.ARRAY.ARRAY).
Il semble non naturel que je suis i> forcé i> utiliser auto code> pour utiliser le résultat de la carte (même si j'aime lazy eval. Et des trucs) de toute façon, merci pour la réponse et le lien
Eh bien, c'est un type modélisé. Et même si le type de retour code> S est externe sur carte code>, et vous pourriez voir exactement ce qu'il était, il serait beaucoup trop moche à utiliser. À son niveau le plus basique, ce serait
map! (Int []) code>, et une fois que vous avez commencé à passer le résultat d'une fonction de plage à une autre, les types sont vraiment laids vraiment très rapides. Par exemple, prenez
jusqu'à code> - une des rares fonctions dans STD.ALGORITHM dont le type est externe. Le type de
jusqu'à! "A == 7" (intar) code> serait
jusqu'à! ("A == 7", int [], vide) code>. Voulez-vous vraiment taper cela? std.algorithm est très puissant, mais sans
auto code>, il borde inutilisable.
En outre, il est généralement considéré comme une bonne pratique en D pour toujours utiliser auto code> sauf si vous ne pouvez pas (par exemple, pour une déclaration de variable qui n'est pas directement initialisée). Ainsi, l'utiliser pour le résultat de
carte code> serait la chose normale à faire même s'il renvoya un tableau.
J'aimerais que vous élaboriez sur «c'est généralement considéré comme une bonne pratique en D pour toujours utiliser Auto». Ce n'est pas évident ce qu'il est sur le côté droit de '='. (comme dans ce cas) et selon le type, je sais ce que je peux ou ne peut pas faire (j'apprécierais vraiment la réponse)
Je veux dire qu'en général, si vous pouvez utiliser auto code>, puis utilisez
auto code>. N'utilisez pas explicitement le type à moins que vous ne l'iez. Deux raisons de cela sont que cela rend le code de refactorisation beaucoup plus facile, car vous n'avez pas à modifier les types de variables lorsque les types utilisés changent, et contribue à rendre votre code plus générique. Ceci est particulièrement important lorsque vous traitez avec des modèles. En général, en utilisant
auto code> rend votre code plus maintenu. Il y a des moments où vous pourriez avoir besoin d'utiliser explicitement un type pour plus de clarté, mais je pense que vous constaterez que cela ne se trouve nulle part aussi souvent que vous pourriez penser.
Et comme je l'ai signalé dans ma réponse, c'est un cas où vous n'avez pas besoin de prendre soin de ce que le type est. Il vous suffit de savoir que c'est une gamme d'ulongs. Le type exact est immatériel. Vous savez ce que vous pouvez faire avec cela, car il s'agit d'une gamme (en tant que documentation), et les gammes ont une API bien définie (comme le livre que j'ai lié à l'explication).
Le Le code source en phobos ressemble à ceci: p> Si vous étudiez le code source que vous étudiez remarquera que résultat code> est un type à l'intérieur
mappe () code> qui ne peut pas être nommé car il s'agit d'un Voldemort Type .
résultat code> n'est qu'une plage: elle dispose de l'habituel
POPFRONT () code> et
vide () code> méthodes et d'autres méthodes en fonction du type de portée qui doit être retourné. Si vous utilisez Type Inference, P>
auto r = map!("a*a")(data);