Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.26.176] |
|
Страницы: (56) « Первая ... 36 37 [38] 39 40 ... 55 56 ( Перейти к последнему сообщению ) |
Сообщ.
#556
,
|
|
|
Цитата D_KEY @ Его проблема в том, скорее всего, придётся отказаться от оператора [](как и пришлось в scala), а это тоже неудобно. Не вижу особой перемоги в замене <> на []. Кстати, если в скалке стали использовать функций для массивов, в плюсах можно сделать так же map<int (unsigned short, char, std::string)> Реализация namespace detail { template<class T> struct meta_map; template<class V, class K> struct meta_map<V (K)> { using type = std::map<K, V>; }; template<class V, class K, class... Keys> struct meta_map<V (K, Keys...)> { using type = std::map<K, typename meta_map<V (Keys...)>::type>; }; } template<class T> using map = typename detail::meta_map<T>::type; |
Сообщ.
#557
,
|
|
|
В D все прозрачно: все что слева стоит на том что справа. Ну и при желании можно сделать так:
Map!(int, string, char, ushort) data; data[a, b, c] = 10; |
Сообщ.
#558
,
|
|
|
Цитата MyNameIsIgor @ Не вижу особой перемоги в замене <> на []. Ну на мой взгляд [] читаются легче. Это же субъективно все. Цитата Кстати, если в скалке стали использовать функций для массивов, в плюсах можно сделать так же map<int (unsigned short, char, std::string)> Неплохо. Но тут все будет именно map'ом. А в общем случае можно хотеть мапу на деревьях, а можно на каком-то уровне захотеть хеш. |
Сообщ.
#559
,
|
|
|
Цитата D_KEY @ Но тут все будет именно map'ом. А в общем случае можно хотеть мапу на деревьях, а можно на каком-то уровне захотеть хеш. Так делов то? namespace detail { template<class T, template<class...> class M> struct meta_map; template<class V, template<class...> class M> struct meta_map<V (), M> { using type = V; }; template<class V, class K, class... Keys, template<class...> class M> struct meta_map<V (K, Keys...), M> { using type = M<K, typename meta_map<V (Keys...), M>::type>; }; } template<template<class...> class M, class T> using map = typename detail::meta_map<T, M>::type; map<std::unordered_map, int (unsigned short, char, std::string)> m; |
Сообщ.
#560
,
|
|
|
Не, я хочу на разных уровнях разные контейнеры.
Добавлено Цитата applegame @ В D все прозрачно: все что слева стоит на том что справа А зачем он там стоит и какая логика за этим? Тайпдефы не только сокращают объявления, они ещё и позволяют уточнять смысл. |
Сообщ.
#561
,
|
|
|
Цитата D_KEY @ Не, я хочу на разных уровнях разные контейнеры. Ну, сам сделаешь? |
Сообщ.
#562
,
|
|
|
Цитата D_KEY @ Он нужен если ты этот тип используешь много раз, а городить тайпдеф ради одного объявления - маразм. А зачем он там стоит и какая логика за этим? Тайпдефы не только сокращают объявления, они ещё и позволяют уточнять смысл. |
Сообщ.
#563
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Он нужен если ты этот тип используешь много раз, а городить тайпдеф ради одного объявления - маразм.А зачем он там стоит и какая логика за этим? Тайпдефы не только сокращают объявления, они ещё и позволяют уточнять смысл. А вот это вот в реальном коде не маразм? int[string][char][ushort] data; Добавлено Цитата MyNameIsIgor @ Цитата D_KEY @ Не, я хочу на разных уровнях разные контейнеры. Ну, сам сделаешь? Ну вот чтоб синтаксис нормальным был не сделаю Мне вариант с вложенными типами нравится больше. И [] нравится больше <>. Вкусовщину обсуждаем, дожили. |
Сообщ.
#564
,
|
|
|
Ну, отец-основатель рассказывал, что [] тоже рассматривались, но в конечном итоге были отвергнуты из-за высокой вероятности синтаксических коллизий. Поэтому был выбран новый тип скобок <> вместо придания новой роли []. К слову, с [] возникли бы сложности со специализациями, хотя когда рассматривался вопрос о виде скобок, о специализациях ещё не думали, до них было ещё далеко.
Добавлено Или это был не отец-основатель, а кто-то из EDG?.. Что-то подзабыл уже. |
Сообщ.
#565
,
|
|
|
Цитата D_KEY @ А вот это вот в реальном коде не маразм? int[string][char][ushort] data; Нет, а в чем проблема? Какой-нибудь int[][] тебе тоже кажется маразмом, или int[5][5]? В D можно и так int[5][string][] data; И тут тоже все понятно. Массив ассоциативных массивов содержащих статические массивы по пять элементов типа int каждый. |
Сообщ.
#566
,
|
|
|
Цитата applegame @ Цитата D_KEY @ А вот это вот в реальном коде не маразм? int[string][char][ushort] data; Нет, а в чем проблема? Да не, все прекрасно, начиная от великолепного и понятного названия переменной, заканчивая говорящим описанием типа. Добавлено Цитата applegame @ В D можно и так int[5][string][] data; Ну все, перехожу на D. Цитата И тут тоже все понятно. Оно может и понятно, но смотрится и читается плохо. Сишные определения тоже понятны, если правила знаешь. Цитата Массив ассоциативных массивов содержащих статические массивы по пять элементов типа int каждый. Мне это очевидным не было. Добавлено Цитата applegame @ Массив ассоциативных массивов содержащих статические массивы по пять элементов типа int каждый. vector[map[string, array[int, 5]]] А если совсем пофантазировать, то это можно было бы как-то так записать: [string->[int:5]] |
Сообщ.
#567
,
|
|
|
Цитата D_KEY @ Его проблема в том, скорее всего, придётся отказаться от оператора [](как и пришлось в scala), а это тоже неудобно. Я почти не знаком со Scala, поэтому не могу с ходу вообразить ситуацию, когда оператор [] будет конфликтовать с использованием [] для параметризации типа. Вот в D же параметры типа задаются в () и это не конфликтует с оператором () вызова процедуры. Да и в C++ же решили проблему >>? Т.е., ИМХО, это чисто скалопроблемы. Добавлено Цитата applegame @ И тут тоже все понятно. Массив ассоциативных массивов содержащих статические массивы по пять элементов типа int каждый. А смысловая нагрузка у этого массива? Ассоциаци там чего с чем? Рандомных строк с рандомными наборами из пяти рандомных чисел? Почему пяти, а не трёх, не восьми? |
Сообщ.
#568
,
|
|
|
Цитата D_KEY @ Ой, давай еще к шрифту и цвету придерись. название переменной ему не понравилось... Давай еще поговорим о понятности наших ников. Тип вполне говорящий, описывается очень легко: V[K].Да не, все прекрасно, начиная от великолепного и понятного названия переменной, заканчивая говорящим описанием типа. Цитата D_KEY @ В D правил особых нет. Все следует одно из другого. Если тип значения тоже ассоциативный массив, то просто подставь его описание вместо V: V[K1][K2] - или просто двумерный ассоциативный массив.Оно может и понятно, но смотрится и читается плохо. Сишные определения тоже понятны, если правила знаешь. Цитата D_KEY @ О да, тут все читабельно, сразу видно где тут типы ключей, а где типы значений.vector[map[string, array[int, 5]]] map[A, B] - двумерный массив? Неее, это ассоциативный массив, у которого ключ - это A, а B - значение. А если мне нужен ассоциативный массив по двум ключам, это будет map[A1, A2, B]? Нее, map[A1, map[A2, B]]. А обращаться к элементам, значит нужно вот так - var[A1[A2]]? Неее - var[A1][A2]. А почему при объявлении скобки вложены, а при обращении нет? Потому что гладиолус. array[int, 5] - двумерный массив? Неее, это одномерный массив фиксированного размера 5. А как будет двумерный массив, array[int, 5, 5]? Неее, вот так - array[array[int, 5], 5]. А обращаться к его элментам, значит нужно вот так - var[2[2]]? Неее - var[2][2]. А почему при объявлении скобки вложены, а при обращении нет? Потому что гладиолус. Цитата D_KEY @ Тут вообще все сразу понятно: массив функций с одним параметром типа string и возвращаемым значением... эм... какого-то типа. [string->[int:5]] Добавлено Цитата korvin @ ИМХО, не об этом речь.А смысловая нагрузка у этого массива? Ассоциаци там чего с чем? Рандомных строк с рандомными наборами из пяти рандомных чисел? Почему пяти, а не трёх, не восьми? Если хочется сделай так: alias Chapter = string; alias Part = uint; alias Line = ushort; struct Words { ... } Words[Line][Part][Chapter] content; auto w = content["Main"][2][10]; |
Сообщ.
#569
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Ой, давай еще к шрифту и цвету придерись.Да не, все прекрасно, начиная от великолепного и понятного названия переменной, заканчивая говорящим описанием типа. Каким боком тут шрифт и цвет? Я же специально уточнил про реальный код. Тут смысловую нагрузку не несут ни тип, ни переменная. Цитата Тип вполне говорящий, описывается очень легко: V[K]. Ну мапишь ты K на V. А зачем? Цитата Если тип значения тоже ассоциативный массив, то просто подставь его описание вместо V: V[K1][K2] - или просто двумерный ассоциативный массив. Ну а мне это не нравится. Я привык, чтобы сначала был ключ, а потом значение. Так удобнее читать. Цитата Цитата D_KEY @ О да, тут все читабельноvector[map[string, array[int, 5]]] Да. Все прямо как ты сказал: Цитата Массив ассоциативных массивов со строковым ключем содержащих статические массивы по пять элементов типа int каждый. Ну дословно же. Цитата map[A, B] - двумерный массив? С какой стати это должен быть двумерный массив? Если ты не понял, то [] тут вместо плюсовых <>. Цитата А если мне нужен ассоциативный массив по двум ключам Что это такое? Я думаю, что ты понимаешь, что у тебя ассоциативный массив с K1 и значениями в виде других ассоциативных массивов с ключем K2 и значением V. Цитата это будет map[A1, A2, B]? Нее, map[A1, map[A2, B]]. Цитата А обращаться к элементам, значит нужно вот так - var[A1[A2]]? Неее - var[A1][A2]. Скорее всего var(A1)(A2). По крайней мере в Scala пришлось сделать так. Не уверен, что это лучший вариант. Но [] для дженериков мне нравятся больше <>. Цитата А почему при объявлении скобки вложены, а при обращении нет? Потому что гладиолус. Что? А почему тут вообще должна быть какая-то связь? Есть описание типов, а есть разные операторы. Цитата Если хочется сделай так: alias Chapter = string; alias Part = uint; alias Line = ushort; struct Words { ... } Words[Line][Part][Chapter] content; Ну мне вот не хочется Тем более, что на самом деле все наоборот. Мы же не на арабском пишем, почему я должен читать справа налево? Цитата auto w = content["Main"][2][10]; А вот это вполне годно. |
Сообщ.
#570
,
|
|
|
В сишных объявлениях и то больше логики, там по крайней мере как пишем, так и используем. А тут все наоборот:
Объявляем Words[Line][Part][Chapter] content А используем: content[chapter_n][part_n][line_n] Все логично и понятно |