Question

Hey les gens, je suis en train d'obtenir ces bits de syntaxe sens pour moi:

S[] split(S)(S s) if (isSomeString!S)
{
    ...
}

et

string join(in string[] words, string sep)
{
    ...
}

(Comme on le voit dans phobos/src/std/string.d)

Pour autant que je peux dire, c'est le morceau de code qui nous permet de faire des choses comme:

string[] parts = "/foo/bar/baz".split("/"); // string[] {"foo", "bar", "baz"}
string part = parts.join("-"); // string "foo-bar-baz"

Ce qui me fait essentiellement croire quelque chose comme les méthodes d'extension que je connais de CSharp sont possibles dans d. Les problèmes que j'ai sont:

  1. Que je ne suis pas 100% sûr que je suis à la recherche sur les déclarations de fonctions ici
  2. Que je ne vois pas ce qui les rend semblables.
Était-ce utile?

La solution

Ils ne sont pas des méthodes d'extension par-soi, juste un bug qui se transforma en une caractéristique propre.

La similitude entre ces deux méthodes est que les deux a une chaîne de caractères en tant que premier paramètre. Donc, l'astuce qui est à l'œuvre ici, est que, étant donné un T tableau [] arr, et une fonction

U foo (T[] t, other params)

peut être appelé en faisant

arr.foo(some arguments matching other params)

Autres conseils

D, toute fonction qui prend un tableau comme premier argument peut être appelé comme si elle était une fonction membre de ce tableau. Et puisque les chaînes sont des tableaux, qui comprendrait des chaînes. Donc, quelque chose comme

T[] replace(in T[] array, in T[] from, in T[] to)

peut être appelé de deux façons différentes:

auto replacedStr1 = replace("hello world", "hello", "goodbye");
auto replacedStr2 = "hello world".replace("hello", "goodbye");

Cette fonction ne fonctionne actuellement que pour les tableaux (IIRC, il est arrivé à cause d'un bug qui permettait, et il a été décidé qu'il était en fait agréable d'avoir, donc il a été en fait une partie de la langue), mais soi-disant , à un moment donné, il sera au travail pour tous les types. Avoir le travail pour tous les types est appelée syntaxe d'appel de fonction uniforme. Avec cette œuvre, vous seriez en mesure de faire des choses comme

auto bigger = 2.max(5);

Mais comme syntaxe d'appel de fonction uniforme n'a pas été encore mis en œuvre, vous ne pouvez faire ce genre de chose avec les tableaux. Il est assez courant pour les gens de programme de cette façon avec des chaînes plutôt que de les transmettre comme premier argument à une fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top