Pregunta

Hola gente, estoy tratando de conseguir estos bits de la sintaxis de sentido para mí:

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

y

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

(Como se ve en phobos/src/std/string.d)

Por lo que yo puedo decir, esta es la parte del código que nos permite hacer cosas como:

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

Lo que básicamente me hace creer algo así como los métodos de extensión que conozco desde CSharp son posibles en d. Los problemas que tengo son:

  1. Que no estoy 100% seguro de que estoy mirando las declaraciones de funciones aquí
  2. Que no veo lo que los hace similares.
¿Fue útil?

Solución

No son los métodos de extensión per se, sólo algunas error que se convirtió en una característica interesante.

La similitud entre los dos métodos es que tanto tiene una cadena como el primer parámetro. Así que el truco es que en el trabajo aquí, es la que da una matriz de T [] arr, y una función

U foo (T[] t, other params)

puede ser llamado por hacer

arr.foo(some arguments matching other params)

Otros consejos

En D, cualquier función que toma una matriz como primer argumento puede ser llamado como si se tratara de una función miembro de la matriz. Y puesto que las cadenas son matrices, que incluiría cuerdas. Por lo tanto, algo así como

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

Se puede llamar de dos maneras diferentes:

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

Esta función actualmente sólo funciona para las matrices (IIRC, que se produjo debido a un error que permitía a ella, y se decidió que en realidad era bueno tener, por lo que se hace realmente una parte de la lengua), pero supuestamente , en algún momento, se hizo con el trabajo de todos los tipos. Tener que funcione para todos los tipos que se llama sintaxis llamada a la función uniforme. Con esto en práctica, que sería capaz de hacer cosas por el estilo

auto bigger = 2.max(5);

Pero a medida que la sintaxis llamada a la función uniforme no se ha aplicado todavía, sólo se puede hacer ese tipo de cosas con matrices. Es muy común que la gente programa de esa manera con cadenas en lugar de pasarlos como primer argumento a una función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top