27112021
This commit is contained in:
parent
3f11e9e2df
commit
fa1477f547
|
@ -0,0 +1,15 @@
|
|||
.dub
|
||||
docs.json
|
||||
__dummy.html
|
||||
docs/
|
||||
/example_11
|
||||
example_11.so
|
||||
example_11.dylib
|
||||
example_11.dll
|
||||
example_11.a
|
||||
example_11.lib
|
||||
example_11-test-*
|
||||
*.exe
|
||||
*.o
|
||||
*.obj
|
||||
*.lst
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"authors": [
|
||||
"alexander"
|
||||
],
|
||||
"description": "Данные и функции",
|
||||
"license": "proprietary",
|
||||
"name": "example_11",
|
||||
"targetPath": "bin"
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
import std.stdio, std.string, std.conv, std.algorithm;
|
||||
|
||||
bool find1(int[] haystack, int needle)
|
||||
{
|
||||
foreach (v; haystack)
|
||||
{
|
||||
if (v == needle)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int[] find2(int[] haystack, int needle)
|
||||
{
|
||||
while (haystack.length > 0 && haystack[0] != needle)
|
||||
{
|
||||
haystack = haystack[1 .. $];
|
||||
}
|
||||
return haystack;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
int[] a = [];
|
||||
assert(find2(a, 5) == []);
|
||||
a = [1, 2, 3];
|
||||
assert(find2(a, 0) == []);
|
||||
assert(find2(a, 1).length == 3);
|
||||
assert(find2(a, 2).length == 2);
|
||||
assert(a[0 .. $ - find2(a, 3).length] == [1, 2]);
|
||||
}
|
||||
|
||||
void bump1(ref int x)
|
||||
{
|
||||
++x;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
int x = 1;
|
||||
bump1(x);
|
||||
assert(x == 2);
|
||||
}
|
||||
|
||||
ref int bump2(ref int x)
|
||||
{
|
||||
return ++x;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
int x = 1;
|
||||
bump2(bump2(x)); // Два увеличения на 1
|
||||
assert(x == 3);
|
||||
}
|
||||
|
||||
void fun(in int x)
|
||||
{
|
||||
// x = 42; // Ошибка! Нельзя изменить параметр с ключевым словом in
|
||||
}
|
||||
|
||||
int divrem(int a, int b, out int rem)
|
||||
{
|
||||
assert(b != 0);
|
||||
rem = a % b;
|
||||
return a / b;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
int r;
|
||||
int d = divrem(5, 2, r);
|
||||
assert(d == 2 && r == 1);
|
||||
}
|
||||
|
||||
bool verbose;
|
||||
void log(lazy string message)
|
||||
{
|
||||
if (verbose)
|
||||
writeln(message());
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
int result = 100;
|
||||
log("foo() returned " ~ to!string(result)); // аргумент вычисляется (происходит обращение к "message") только если verbose истина
|
||||
}
|
||||
|
||||
/**
|
||||
* Параметры типов
|
||||
*/
|
||||
|
||||
T[] find3(T)(T[] haystack, T needle)
|
||||
{
|
||||
while (haystack.length > 0 && haystack[0] != needle)
|
||||
{
|
||||
haystack = haystack[1 .. $];
|
||||
}
|
||||
return haystack;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
double[] d = [1.5, 2.4];
|
||||
assert(find3(d, 1.0) == null);
|
||||
assert(find3(d, 1.5) == d);
|
||||
string[] s = ["one", "two"];
|
||||
assert(find3(s, "two") == ["two"]);
|
||||
}
|
||||
|
||||
// Выражение if в сигнатуре функции во всеуслышание заявляет,
|
||||
// что функция find примет параметр haystack типа T[] и параметр needle типа E,
|
||||
// только если выражение haystack[0] != needle возвращает логический тип
|
||||
T[] find4(T, E)(T[] haystack, E needle) if (is(typeof(haystack[0] != needle) == bool))
|
||||
{
|
||||
while (haystack.length > 0 && haystack[0] != needle)
|
||||
{
|
||||
haystack = haystack[1 .. $];
|
||||
}
|
||||
return haystack;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
double[] d = [1.5, 2.4];
|
||||
assert(find4(d, 1.0) == null);
|
||||
assert(find4(d, 1.5) == d);
|
||||
string[] s = ["one", "two"];
|
||||
assert(find4(s, "two") == ["two"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Перегрузка
|
||||
*/
|
||||
|
||||
T1[] find5(T1, T2)(T1[] longer, T2[] shorter)
|
||||
if (is(typeof(longer[0 .. 1] == shorter) : bool))
|
||||
{
|
||||
while (longer.length >= shorter.length)
|
||||
{
|
||||
if (longer[0 .. shorter.length] == shorter)
|
||||
break;
|
||||
longer = longer[1 .. $];
|
||||
}
|
||||
return longer;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
double[] d1 = [6.0, 1.5, 2.25, 3];
|
||||
float[] d2 = [1.5, 2.25];
|
||||
assert(find5(d1, d2) == d1[1 .. $]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Функции высокого порядка. Функциональные литералы
|
||||
*/
|
||||
|
||||
T[] find(alias pred, T)(T[] input) if (is(typeof(pred(input[0])) == bool))
|
||||
{
|
||||
for (; input.length > 0; input = input[1 .. $])
|
||||
{
|
||||
if (pred(input[0]))
|
||||
break;
|
||||
}
|
||||
return input;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
int[] a = [1, 2, 3, 4, -5, 3, -4];
|
||||
// Найти первое отрицательное число
|
||||
auto b = find!(function bool(int x) { return x < 0; })(a);
|
||||
auto c = find!((x) { return x < 0; })(a);
|
||||
writeln(b[0], ' ', c[0]);
|
||||
}
|
||||
|
||||
// Получив значение x типа T, возвратить функцию,
|
||||
// которая находит первое значение, равное x, в массиве элементов типа T
|
||||
|
||||
// T[]delegate(T[]) finder(T)(T x) if (is(typeof(x == x) == bool))
|
||||
// {
|
||||
// return delegate(T[] a) { return find3(a, x); };
|
||||
// }
|
||||
|
||||
auto finder(T)(T x) if (is(typeof(x == x) == bool))
|
||||
{
|
||||
return (T[] a) { return find3(a, x); };
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
auto d = finder(5);
|
||||
assert(d([1, 3, 5, 7, 9]) == [5, 7, 9]);
|
||||
d = finder(10);
|
||||
assert(d([1, 3, 5, 7, 9]) == []);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
}
|
Reference in New Issue