
Oleg
24.08.2017
01:34:55
Обнаружил в ванной, думаю стоит выкинуть

Maxim
24.08.2017
03:50:06
главное убедиться, что кто-то будет его ловить

Ievgenii
24.08.2017
09:47:49
))))

Dmitry
24.08.2017
10:57:33
Как я понимаю в Шарпе все же добавили интерполяцию строк:
Console.WriteLine($"Hello {args[0]}!");

Google

NullSanya
24.08.2017
10:58:02
В 6 версии

Dmitry
24.08.2017
10:58:13
а она когда примерно вышла?

NullSanya
24.08.2017
10:58:33
Хм... Когда vs 2015 вроде
Точно не помню
Да, 2015 год

Dmitry
24.08.2017
11:44:23
А на шарпе есть аналог Дишного version(OSName) ?

NullSanya
24.08.2017
11:50:45
мб как то можно через #if

Maxim
24.08.2017
11:53:11
ну там, по сути, тогда будет version(Windows) и version(Mono)

NullSanya
24.08.2017
11:53:36
или в рантайме уже чекать ос

Dmitry
25.08.2017
07:00:13
Ребят, а как заставить https://dlang.org/phobos/std_file.html#write писать в бинарном режиме?
я пробовал f.write(cast(ubyte[])rs.responseBody.data);. не заработало
p.s. про rawWrite знаю

Maxim
25.08.2017
07:01:51
так это, по сути, тот же write, который и на экран пишет, только через rawWrite

Google

Maxim
25.08.2017
07:02:33
а, ну или cast(string) попробовать)

Dmitry
25.08.2017
07:02:51
мне бинарные данны надо записать
write в каком режиме пишет? как его назвать?

Maxim
25.08.2017
07:03:15
ни в каком)

Dmitry
25.08.2017
07:03:26
в плане?

Maxim
25.08.2017
07:03:36
ну в прямом плане)

Dmitry
25.08.2017
07:04:33
объясни плиз, не понимаю

Maxim
25.08.2017
07:05:27
в каком режиме открывать файл, ты казываешь при его открытии "wb" — запись в binary mode

Dmitry
25.08.2017
07:05:44
А!
а просто режим w это как его назвать?

Maxim
25.08.2017
07:06:12
а write интерпретирует переданные ему данные, если ты передашь в него byte[], он запишет [1, 2, 480, 15] и так далее)
поэтому, можно попробовать записать cast(string), по идее, должно прокатить, поскольку в D строки не null-terminated, но лучше, конечно, rawWrite использовать

Dmitry
25.08.2017
07:07:41
а почему string если данные бинарные то?

Maxim
25.08.2017
07:08:15
ну потому что string — это последовательность байтов, которую write не должен никак интерпретировать

Dmitry
25.08.2017
07:08:19
Request rq = Request();
Response rs = rq.get("http://geoserver.readthedocs.io/en/latest/_images/imagemosaiccreate1.png");
File f = File("123.png", "wb");
f.write(cast(ubyte[])rs.responseBody.data);
пробовал с кастом и без — пишет 1 2 480 15
сейчас попробую стринг

Maxim
25.08.2017
07:08:55
а чем rawWrite не устраивает?

Dmitry
25.08.2017
07:09:02
фигеть! стринг работает!
да я просто хочу во первых разобраться во вторых разрабу dlang-request помочь с докой

Maxim
25.08.2017
07:09:35
ну он и должен работать)

Google

Dmitry
25.08.2017
07:10:00
а почему фишка с ubyte[] не работает?
вроде массив битов...

Maxim
25.08.2017
07:11:26
потому что write, в зависимоти от переданного типа пытается вывести его в человекопонятном виде, массивы он выводит в виде последовательности значений через запятую
структуру в формате имяСтруктуры(значение1, значение2) и так далее
а строка и есть строка — это последовательность байтов, кодирующся символы, поэтому write ее так и выводит)
но вообще, конечно, это извращение, самый простой способ записать бинарные данные в файл — это fwrite, надстройкой над которым и является rawWrite


Dmitry
25.08.2017
07:25:21
@maxfreck не мог бы глянуть перед тем как я тому разрабу отправлю?
Для записи загруженного файла рекомендуется использовать функцию rawWrite из состава std.stdio которая выполняет запись в бинарном виде.
Возможно так же использовать функцию write, но тут следует учитывать, что она пытается интерпритировать входной массив в человекопонятном виде. Так при записи бинарного файла вы можете получить последовательность вида [1, 2, 480, 15, 72]. Чтобы этого избежать вам нужно указать, что последовательность нужно интерпритировать как единое целое выполнив cast к типу string.
Пример:
File f = File("123.png", "wb"); // не забываем указать что открываем файл на запись в бинарном режиме
f.write(cast(string)rs.responseBody.data);
Пример 2:
File f = File("123.png", "wb");
f.rawWrite(rs.responseBody.data);

Maxim
25.08.2017
07:26:16
ну да, все вроде так)

Dmitry
25.08.2017
07:33:36
Так, а кто мне пример простого делегата может показать? https://tour.dlang.org/tour/en/basics/delegates смотрел, но сути так и не понял

Maxim
25.08.2017
07:35:38
делегат — это просто функция, которая знает о переменных в своей области видимости
она же closure или замыкание

Dmitry
25.08.2017
07:36:19

Maxim
25.08.2017
07:38:03
ну вот если ты просто объявишь функцию внутри функции, то она не будет иметь доступа к переменным, которые объявлены рядом с ней в этой же функции, а делегать будет

Dmitry
25.08.2017
07:38:56
void foo()
{
int x;
void bar()
{
int y;
}
}
так типа? и y не будет виден из foo ?

Maxim
25.08.2017
07:42:58
вот пример

Dmitry
25.08.2017
07:43:22
О, спасибо, смотрю
а если сюда классы добавляются, то как будет выглядеть?

Maxim
25.08.2017
07:51:08
да так же все будет выглядеть)

Google

Dmitry
25.08.2017
07:51:56
только там будет экземпляр класса так?

Maxim
25.08.2017
07:52:21
там это где?)

Dmitry
25.08.2017
07:53:31
MyClass mc = new MyClass(); // тут есть foo()
auto doFooFunct = delegate()
{
mc.foo() ;
}

Maxim
25.08.2017
07:53:38
по сути, function(params) и delegate(params) — это объявление анонимных функций, одна без контекста, другое с контекстом
та, которая delegate, может использовать любые переменные из окружающего контекста, в том числе и классы, и структуры
по сути да, вызов метода класса ничем не отличается от вызова метода в любом другом месте

Dmitry
25.08.2017
07:55:11
итого мы создали функцию и на нее другую функцию повесили так?
"та, которая delegate, может использовать любые переменные из окружающего контекста"
и передавать их в ту функцию на которую она указывает?
import std.stdio;
import std.file;
void main()
{
string name = "Mike";
MyClass mc = new MyClass();
auto mydel = delegate()
{
mc.say(name);
};
mydel();
}
class MyClass
{
void say(string name)
{
writeln("Hello, ", name);
}
}
это вся магия? Или я чего-то упускаю?

Admin
ERROR: S client not available

Dmitry
25.08.2017
08:14:03
мы же могли просто без делегата все вызвать
"Это указатель на функцию, который дополнительно содержит информацию об контексте"
Контекст это что?

Maxim
25.08.2017
08:56:05
у каждой переменной есть область видимости, грубо говоря, за пределами фигурных скобок, в которых она объявлена, ее не видно
делегат и функция из моего пример — это те же самые перменые, их можно передать параметром в какую-нибудь функцию, находящуюся, например, в другом модуле, и она сможет там вызвать функцию через переменную
отличие делегата от функции в том, что делегат знает, что рядом с ним была объявлена переменная hello
вот более сложный пример)


Andrey
25.08.2017
09:12:19
главное понять что делегат это указатель на функцию + указатель на контекст
в поле контекста может храниться указатель на структуру или класс (когда делегат получается путем взятия адреса метода), либо контекст это стек-фрейм внешней функции (когда делегат получается путем взятия адреса вложенной функции), либо замыкание (когда делегат получается путем взятия адреса вложенной функции и функция использует внешние переменные, и при этом делегат живет дольше используемых переменных; в таком случае все переменные копируются на кучу и контекст указывает на эти переменные)

Dmitry
25.08.2017
09:47:16
забыл, как дабу передать флаги dmd типа -betterС
пробовал:
dub dflags=betterС

Google

Dmitry
25.08.2017
09:52:20
> dub build dflags "-betterС"
Failed to find a package named 'dflags'.
если слово build убрать, то тупо справку выводит вместо сборки проекта

Maxim
25.08.2017
09:57:04
это, насколько я понимаю, в dub.json или dub.sdl должно быть
"dflags": ["-betterC"]

Dmitry
25.08.2017
09:57:45
а в консоли передать нельзя?

Pavel
25.08.2017
09:58:34
попробуй --dflags или --dflags-dmd

Ievgenii
25.08.2017
10:23:29
Важно понимать, что делегат - потенциальная точка утечки памяти. Я не говорю их не использовать, сам их часто использую, просто важно это помнить!
Как когда-то Александреско сказал: разница между анонимной функцией и делигатом не велика, всего один указатель (4 или 8 байт)...
Вот так красиво завуалировал)))

Maxim
25.08.2017
10:25:53
а почему это точка утечки памяти?)

Ievgenii
25.08.2017
10:26:35
Ты замыкаешь контекст, и если этот делегат не будет удален, то и тот стек (контекст) не будет удален.
Это не точка утечки памяти, а потенциальная утечка памяти.
Поэтому то и стараются использовать анонимные функции
Есть даже подход, когда в методе создают анонимную функцию, в нее передают только те параметры, которые нужно, а уже в этой анонимной функции создаётся делегат...
Вот такие извращения видел...

Maxim
25.08.2017
10:31:16
ну это не утечка памяти, а просто излишнее потребление, все равно рано или поздно сборщик все удалит

Ievgenii
25.08.2017
10:31:37
Нет
Если делегат останется где-то висеть, то его не удалят, а вместе и с ним останется ссылка на контекст...
То и контекст не удалится...

Maxim
25.08.2017
10:33:01
а где он может остаться так висеть?

Ievgenii
25.08.2017
10:59:48
Ну в каком-то таймере или ещё где-то ссылку оставишь.