Domanda

Ciao ragazzi, sto cercando di ottenere questi pezzi di sintassi di dare un senso a me:

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

e

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

(Come si vede nella phobos/src/std/string.d)

Per quanto posso dire, questo è il pezzo di codice che ci permette di fare cose del genere:

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

Il che rende praticamente mi creda qualcosa come i metodi di estensione che conosco da CSharp sono possibili in d. I problemi che ho sono:

  1. Che io non sono al 100% sicuro che sto guardando le dichiarazioni di funzione proprio qui
  2. Che io non vedo ciò che li rende simili.
È stato utile?

Soluzione

Sono non i metodi di estensione per-sé, solo alcuni bug che si trasformò in una caratteristica pulito.

La somiglianza tra i due metodi è che sia ha una stringa come primo parametro. Quindi il trucco che è al lavoro qui, è che, data una matrice T [] arr, e una funzione

U foo (T[] t, other params)

può essere chiamato da fare

arr.foo(some arguments matching other params)

Altri suggerimenti

In D, qualunque funzione che prende un array come primo parametro può essere chiamato come se fosse una funzione membro di tale matrice. E dal momento che le stringhe sono array, che dovrebbe includere le stringhe. Quindi, qualcosa come

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

può essere chiamato in due modi diversi:

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

Questa funzione attualmente funziona solo per gli array (IIRC, avvenne a causa di un bug che ha permesso, e si è deciso che in realtà è stato bello avere, quindi è stato effettivamente fatto una parte del linguaggio), ma si suppone , ad un certo punto, si sarà fatto il lavoro per tutti i tipi. Avendo il lavoro per tutti i tipi si chiama sintassi della funzione di chiamata uniforme. Con quello implementato, devi essere in grado di fare cose come

auto bigger = 2.max(5);

Ma, come sintassi della funzione di chiamata uniforme non è stato ancora implementato, si può solo fare una cosa del genere con gli array. E 'abbastanza comune per le persone a programmare in questo modo con le stringhe piuttosto che passarli come primo argomento a una funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top