6
votes

résultat de std.algorithm.map

Quelqu'un pourrait-il dire ce que std.algorithm.map retourne? (Lien vers une page de documentation serait très apprécié) Du message d'erreur, son résultat est de type résultat xxx

dans http://dlang.org/phobos/std_algorithm.html#map Il y a assez de petites informations sur celui-ci: xxx

de ceci n'est pas clair, quoi Je peux ou ne peux pas faire avec ça.


0 commentaires

3 Réponses :


3
votes

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));


2 commentaires

@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 devrait toujours avoir des parens dessus, cependant, il ne compilera pas avec -Property (et -Property est censé devenir le comportement normal Finalement, faire les parens nécessaires ici, car tableau n'est pas une propriété).



7
votes

Vous n'êtes pas censé savoir ou se soucier de ce que std.algorithm.map 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 fait le premier; trouve le dernier). Utilisez auto : xxx

la plage renvoyée par carte est paresseux. Cela ne fait rien jusqu'à ce que vous soyez itérale dessus (il appelle ensuite la fonction donnée sur chaque avant 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 afin que vous ne puissiez en créer un directement. Vous devez utiliser auto pour déduire le type ou typeof pour obtenir le type: xxx

Cependant, vous Utilisez uniquement typeof lorsque vous avez besoin d'une variable que vous ne pouvez pas initialiser directement. auto est presque toujours le moyen d'aller.

Si vous devez créer un tableau à partir du résultat de la carte (ou depuis une autre plage), Ensuite, utilisez std.array.array : xxx

Si vous ne connaissez pas beaucoup de gammes, vous devriez probablement lire Ceci . Malheureusement, il n'existe actuellement pas d'article sur Dlang.org Expliquer les gammes, mais ce lien est pour un chapitre dans un livre que l'un des membres de la communauté D a écrit en Turc et traduit en anglais et couvre des gammes équitablement Eh bien.

EDIT :

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: Voldemort types dans d .


8 commentaires

"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 et non quelque chose que vous allez utiliser. Vous venez d'utiliser auto 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 forcé utiliser auto 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 S est externe sur carte , et vous pourriez voir exactement ce qu'il était, il serait beaucoup trop moche à utiliser. À son niveau le plus basique, ce serait map! (Int []) , 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'à - une des rares fonctions dans STD.ALGORITHM dont le type est externe. Le type de jusqu'à! "A == 7" (intar) serait jusqu'à! ("A == 7", int [], vide) . Voulez-vous vraiment taper cela? std.algorithm est très puissant, mais sans auto , il borde inutilisable.


En outre, il est généralement considéré comme une bonne pratique en D pour toujours utiliser auto 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 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 , puis utilisez auto . 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 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).



1
votes

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 .

Le

Le code source en phobos ressemble à ceci: p> xxx pré>

Si vous étudiez le code source que vous étudiez remarquera que 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);


0 commentaires