Frage

Hey Leute, ich versuche, diese Syntax -Teile für mich zu machen:

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

und

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

(Wie in ... gesehen phobos/src/std/string.d)

Soweit ich das beurteilen kann, ist dies der Code, mit dem wir Dinge tun können:

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

Was mich im Grunde genommen glauben lässt, dass so etwas wie die Erweiterungsmethoden, die ich von CSHARP kenne, in d möglich sind. Die Probleme, die ich habe, sind:

  1. Ich bin mir nicht zu 100% sicher, dass ich hier die richtigen Funktionserklärungen betrachte
  2. Dass ich nicht sehe, was sie ähnlich macht.
War es hilfreich?

Lösung

Es sind keine Erweiterungsmethoden pro Sees, nur ein Fehler, der zu einer ordentlichen Funktion wurde.

Die Ähnlichkeit zwischen diesen beiden Methoden besteht darin, dass beide eine Zeichenfolge als erster Parameter haben. Der Trick, der hier arbeitet, ist der Angesicht

U foo (T[] t, other params)

kann aufgerufen werden, indem Sie dies tun

arr.foo(some arguments matching other params)

Andere Tipps

In D kann jede Funktion, die ein Array als erstes Argument nimmt, so genannt werden, als wäre es eine Mitgliedsfunktion dieses Arrays. Und da Saiten Arrays sind, würden die Saiten enthalten. Also so etwas wie

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

kann als zwei verschiedene Arten bezeichnet werden:

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

Diese Funktion funktioniert derzeit nur für Arrays (IIRC, es kam aufgrund eines Fehlers, der es zulässt, und es wurde beschlossen, dass es tatsächlich schön war, es zu haben, also wurde sie tatsächlich einen Teil der Sprache gemacht), aber angeblich in einigen Punkt, es wird gemacht, für alle Arten zu arbeiten. Es wird für alle Typen als einheitliche Funktionsaufrufsyntax bezeichnet. Mit diesem implementierten könnten Sie Dinge wie

auto bigger = 2.max(5);

Da jedoch noch nicht einheitliche Funktionsaufrufsyntax implementiert wurde, können Sie so etwas nur mit Arrays tun. Es ist ziemlich üblich, dass Menschen auf diese Weise mit Strings programmieren, anstatt sie als erstes Argument für eine Funktion zu übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top