Методы расширения в D? - PullRequest
       7

Методы расширения в D?

2 голосов
/ 21 января 2011

Эй, ребята, я пытаюсь сделать так, чтобы синтаксис имел смысл для меня:

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

и

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

(Как видно из phobos/src/std/string.d)

Насколько я могу судить, это кусок кода, который позволяет нам делать что-то вроде:

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

Что в основном заставляет меня верить, что методы расширения, которые я знаю из CSharp, возможны в d. У меня есть следующие проблемы:

  1. То, что я не уверен на 100%, я смотрю здесь правильные объявления функций
  2. Что я не вижу, что делает их похожими.

Ответы [ 2 ]

7 голосов
/ 21 января 2011

Они не являются методами расширения сами по себе, просто какая-то ошибка, которая превратилась в изящную функцию.

Сходство между этими двумя методами состоит в том, что оба имеют строку в качестве первого параметра. Таким образом, хитрость, которая работает здесь, заключается в том, что с массивом T [] arr и функцией

U foo (T[] t, other params)

можно вызвать, набрав

arr.foo(some arguments matching other params)
3 голосов
/ 21 января 2011

В D любая функция, которая принимает массив в качестве первого аргумента, может вызываться так, как если бы она была функцией-членом этого массива. А поскольку строки являются массивами, это будет включать строки. Итак, что-то вроде

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

можно назвать двумя разными способами:

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

Эта функция в настоящее время работает только для массивов (IIRC возникла из-за ошибки, которая позволила это сделать, и было решено, что на самом деле это было приятно, поэтому она фактически стала частью языка), но предположительно в какой-то момент он будет работать для всех типов. Работа с ним для всех типов называется единообразным синтаксисом вызова функций. После этого вы сможете делать что-то вроде

auto bigger = 2.max(5);

Но поскольку единый синтаксис вызова функции еще не реализован, вы можете делать такие вещи только с массивами. Люди часто программируют таким образом со строками, а не передают их в качестве первого аргумента функции.

...