@dlangru

Страница 71 из 719
Dmitry
15.09.2016
13:26:25


не компилится

Oleg
15.09.2016
13:26:58
Dmitry
15.09.2016
13:27:33
так, а надо так т.к. это ключевое слово или как понять что именно так вывается?

Google
Oleg
15.09.2016
13:27:39
поворот сейчас для меня в этом был import std.stdio; string attr = "ok"; void foo() { @attr int k; writeln( __traits(getAttributes,k) ); } void main() { foo(); attr = "42"; foo(); } выводит ok 42

тоесть UDA могут менять значения в runtime

так, а надо так т.к. это ключевое слово или как понять что именно так вывается?
это в документации написано, что именно так вызывается

я не знаю как это понять

и __traits и getAttributes — ключевые слова, но второе, кажется, контекстное

да, контесто-зависимый синтаксис

Dmitry
15.09.2016
13:29:56
контекстное — определено втнутри __traits ?

Oleg
15.09.2016
13:30:03
ну типа да...

вне __traits ты можешь использовать getAttributes как хочешь (название метода, поля и тд)

Anatoly
15.09.2016
13:31:41
да, UDA не только компилтайм

Dmitry
15.09.2016
13:31:52
Вообще ничего не выводит: void main() { foo(); } string MyAtr; void foo() { @MyAtr int name; writeln(__traits(getAttributes, name)); }

Anatoly
15.09.2016
13:32:48
а что должно вывести?

Dmitry
15.09.2016
13:33:04
а походу надо: string MyAtr = "some value";

Google
Dmitry
15.09.2016
13:34:25
так, а чтобы на этапе компиляции проверить значение переменной нужно static if использовать?

Oleg
15.09.2016
13:35:21
так, а чтобы на этапе компиляции проверить значение переменной нужно static if использовать?
да, но не со всеми переменными будет работать, а только с теми, что известны во время компиляции

а в основном это не переменные))

а константы

Dmitry
15.09.2016
13:37:18
я как-то уже спрашивал. Но так до конца и не получил ответ. Можно ли проверять значение строки во время компиляции и если строка "Вася" то для нее вызывать writeln простой а если "Маша" то его аналог cwriteln().color(Green).

или как-то так?

Oleg
15.09.2016
13:37:58
конечно можно, но не той строки, которую ты получишь во время runtime

Dmitry
15.09.2016
13:45:50
так. правильно ли я понимаю, что вот допустим я создаю два атрибута: string good = "good"; string bad = "bar"; и могу их теперь на функции и переменные вешать. И потом делать проверку если атрибут good то ...

Oleg
15.09.2016
13:47:43
ну да

Dmitry
15.09.2016
13:49:10
м... э... щас задачу сам себе придумываю. Обойти все методы в классе и вызывать только те которые как good объявлены. Норм?

Oleg
15.09.2016
13:50:00
при этом ты можешь сделать не good и bad имена переменных, а другие

и поочерёдно присваивать им значения good и bad

Dmitry
15.09.2016
13:50:29
только вот у Али написано что есть такой атрибут как hasUDA (или как его назвать то? Метод?) а в доках я его не вижу

Вот у него как: import std.traits; // ... static assert(hasUDA!(Person.name, Encrypted));

Oleg
15.09.2016
13:51:08
новая тема, когда я ту статью писал, не было такого

Dmitry
15.09.2016
13:51:08
https://dlang.org/spec/traits.html

Oleg
15.09.2016
13:53:55
https://dlang.org/phobos/std_traits.html#.hasUDA

Dmitry
15.09.2016
13:54:21
в спецификации забыли про него?

по ссылке выше

Oleg
15.09.2016
13:54:34
это phobos

Google
Oleg
15.09.2016
13:54:42
это не язык

всмысле это стандрартная библиотека и в спеке языка не описывается она

Dmitry
15.09.2016
13:55:10
я постоянно путаю где заканчивается язык и начинается Фобос

Oleg
15.09.2016
13:55:28
грани в некоторых местах размыты

Dmitry
15.09.2016
13:56:08
а ты вот сходу понял что это ? или просто логическая цепочка какая?

я посмотрел и не понял

Grigirii
15.09.2016
13:57:47
на тему полезности UDA можно посмотреть в сторону сериализаторов http://vibed.org/api/vibe.data.serialization/optional и автогенераторов http://vibed.org/api/vibe.web.rest/registerRestInterface

чтобы понять лучше всего попробовать придумать самому, как решить эту задачу, собрать все грабли и только потом будет понятно зачем всё это придумано. пока ручками замучаешься сериализаторы писать это выглядит излишне сложным

Dmitry
15.09.2016
14:03:38
почему false то получается?



и в чем отличие __traits от std.traits ?

Anatoly
15.09.2016
14:04:38
фигасе вопрос)

Grigirii
15.09.2016
14:04:53
первое - язык, второе стандартная библиотека использующая язык

Oleg
15.09.2016
14:05:25
нужно проверять не значение а переменную, судя по документации

hasUDA!(foo, good)

Dmitry
15.09.2016
14:05:49
тоесть либа просто __traits вызывает где-то внутри?

а...

Grigirii
15.09.2016
14:06:05
в основном да, либо делает это другими способами

Oleg
15.09.2016
14:06:25
в основном да, либо делает это другими способами
скорее не другими, а просто упрощает

Google
Dmitry
15.09.2016
14:06:49
Хотя погоди, почеу не значение а переменную? В доке же написано: static assert(hasUDA!(a, "alpha"));

т.е. явно значение проверяется

Oleg
15.09.2016
14:07:53
явно проверяется наличие строкового атрибута

он задаётся в скобках

Dmitry
15.09.2016
14:08:04
Олег, да с writeln(hasUDA!(foo, good)); работает

Oleg
15.09.2016
14:08:12
@("alpha") int k

Dmitry
15.09.2016
14:08:15
аа...

все понял

Oleg
15.09.2016
14:08:34
проверяется наличие, но не значение

Admin
ERROR: S client not available

Oleg
15.09.2016
14:08:52
потом можно __traits получить значение

вот тут, кстати, не совсем понятно зачем в std.traits занесено template isAbstractFunction(T...) if (T.length == 1) { enum bool isAbstractFunction = __traits(isAbstractFunction, T[0]); }

Dmitry
15.09.2016
14:10:07
а смысл в чем использвования чисто языковой фишки __traits вместо судя по всему более удобной библиотечной обертки над ним?

Oleg
15.09.2016
14:10:33
ну если по функциональности одно и тоже, то нет смысла

Grigirii
15.09.2016
14:11:02
смысла нет, просто в дизайне языка надо разносить ядро и библиотеку. Всё же в язык не запихаешь, а без базовой поддержки языка и библиотеку не напишешь

Oleg
15.09.2016
14:11:07
а вот получить значение атрибута, как я понял, только через __traits(getAttributes,...);

Grigirii
15.09.2016
14:11:33
template getUDAs(alias symbol, alias attribute)

Oleg
15.09.2016
14:12:03
Grigirii
15.09.2016
14:12:39
в своём коде лучше пользоваться std.traits. в __traits есть смысл лезть очень редко

Dmitry
15.09.2016
14:14:51
Я вот щас на getUDAs смотрю. Они первым параметром символ передают, а вторым — набор атрибутов как понял.

Google
Dmitry
15.09.2016
14:15:01
import std.stdio; import std.exception; import std.typecons; import std.traits; void main() { writeln(getUDAs!(foo, good)); // мне нужно вывести имя атрибута повешенного на функцию } string good = "good"; string bad = "bar"; @good void foo() { } @bad void bar() { }

Grigirii
15.09.2016
14:17:57
__traits(getFunctionAttributes,

а в библиотеке его похоже нет

https://dlang.org/spec/traits.html#getFunctionAttributes

блин, это не те атрибуты, потому и нет

getAttributes, вот trait, который нужен

Dmitry
15.09.2016
14:19:57
погоди, а в моем случае то как быть? Мне нужно вывести имя атрибута который на функцию повешен

Grigirii
15.09.2016
14:20:47
writeln(__traits(getAttributes, foo));

Dmitry
15.09.2016
14:21:03
а getUDAs разве не то?

Grigirii
15.09.2016
14:21:16
это будет список символов. значения по этим символам можно вытаскивать по getUDAs

Dmitry
15.09.2016
14:21:54
так: "of the given type from the given symbol." типа когда повешан какой-то известный массив\структура атрибутов а не одиночные?

Grigirii
15.09.2016
14:27:34
да. getAttributes вытащит вообще все навешанные атрибуты

Dmitry
15.09.2016
17:25:26
Если write обявлена как шаблонная функция: void write(S...)(S args) это же шаблонная так? то получается ей и аргументы можно через восклицательный знак передавать или нет? типа write!"some text"

оно ругается: Error: template instance std.stdio.write!"some text" does not match template declaration write(T...)(T args) if (!is(T[0] : File))

О, вот так скомпилилось: write!string("some text");

T - тип получается и следующие скобки args типа T так?

Grigirii
15.09.2016
17:30:14
да

Dmitry
15.09.2016
17:30:46
И если компилятор может тип сам определить, то восклицательный знак и указание типа можно пропустить

так а если у меня вайб падает на сервере в непонятные моменты, то кроме как логгирование втыкать везде и всюду других способов найти багу нет? Просто я даже не знаю какой момент логгировать в начале

Oleg
15.09.2016
17:48:48
так а если у меня вайб падает на сервере в непонятные моменты, то кроме как логгирование втыкать везде и всюду других способов найти багу нет? Просто я даже не знаю какой момент логгировать в начале
ну если сервер запускается, какое-то время работает, то наверное в инициализации нет смысла через каждую точку ставить логирование

имеет смысл в том коде, который крутится постоянно

Dmitry
15.09.2016
17:49:53
короче начать с main?

Страница 71 из 719