Здравствуйте, ambel-vlad, Вы писали:
AV>Hi Константин Л.
VD>>>Ну, придумай осмысленную задачу. И вообще, ты же сам сравнивал кортежи со структурами. Тебя не удивляет, что струтуру тоже нельзя перебрать?
КЛ>>так вот если бы кортеж можно было перебрать, то это было бы знач. преимущество над структурой. Иногда очень нужно пребрать поля какой-либо структуры.
AV>А зачем перебирать надо? Может проще сразу присвоить соответсвующим переменным нужные значения. AV>Вот тебе пример из Питона
[]
а может я к каждому элементу шаблонную/generic функцию зааплаить хочу?
Hi Константин Л.
КЛ>>>так вот если бы кортеж можно было перебрать, то это было бы знач. преимущество над структурой. Иногда очень нужно пребрать поля какой-либо структуры.
AV>>А зачем перебирать надо? Может проще сразу присвоить соответсвующим переменным нужные значения. AV>>Вот тебе пример из Питона
КЛ>а может я к каждому элементу шаблонную/generic функцию зааплаить хочу?
Hi VladD2
AV>>Ну если где-то не реализован проход по кортежу, то это не значит, что это вообще невозможно.
V>На само деле он реализован, но только для времени компиляции, где он и имеет смысл. А в рантайме это бессмысленно.
Мне тоже такое не приходилось делать. Но человек просил — ему показали что и такое можно сделать.
V>Приведенный пример на ди тоже производит перебор во время компиляции.
Здравствуйте, ambel-vlad, Вы писали:
AV>А зачем перебирать надо? Может проще сразу присвоить соответсвующим переменным нужные значения. AV>Вот тебе пример из Питона
AV>
AV>def testFun():
AV> return ("aaa", "b")
AV>(a,b)=testFun()
AV>print a
AV>print b
AV>
Извини, но это просто возврат кортежа из метода. Это любой язык поддерживающий кортежи поддерживает. Тут никакого перебора нет и в поминке.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
AV>>А зачем перебирать надо? Может проще сразу присвоить соответсвующим переменным нужные значения. AV>>Вот тебе пример из Питона
AV>>
AV>>def testFun():
AV>> return ("aaa", "b")
AV>>(a,b)=testFun()
AV>>print a
AV>>print b
AV>>
VD>Извини, но это просто возврат кортежа из метода.
Плюс декомпозиция "на лету" (я не спорю, а уточняю. я не в курсе, есть ли языки, поддерживающие кортежи, но не поддерживающие их inline-декомпозицию).
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>Плюс декомпозиция "на лету" (я не спорю, а уточняю. я не в курсе, есть ли языки, поддерживающие кортежи, но не поддерживающие их inline-декомпозицию).
Думаю, что нет. Это родом из ML-я. Так что все кто драли кортежи содрали и идею его декомпозиции. Хотя в C# 3.0 будут аналоги кортэжей (анонимные типы) в которых не будет декомпозиции, но элементы будут именованными. Глобальная глупость решения МС в том, что анонимные типы нельзя будет описать. Они могут быть только выведены компиляторо из использования. Но это не позволяет использовать и для возврата данных и методов. Что, на мой взгляд, является откровенным дизайнерским промахом. Причем обосновывается он тем, что мол для этого прийдется менять рантайм дотнета. И это особснование?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Глобальная глупость решения МС в том, что анонимные типы нельзя будет описать.
А какой смысл в описании анонимных типов? Можешь пример использования привести?
И какой синтаксис тебе видится? На манер анонимных делегатов?
Здравствуйте, EvilChild, Вы писали:
VD>>Глобальная глупость решения МС в том, что анонимные типы нельзя будет описать. EC>А какой смысл в описании анонимных типов?
У меня такого вопроса даже не возникает. Лично я не вижу смысла в них без возможности их выразить. Вообще странно что тип есть, а описать его нельзя.
EC>Можешь пример использования привести?
Возврат значения из метода. Сделал ты красивый запрос через LINQ и хочешь поместить его в фукнцию. Ан та тебе — нельзя. Ведь запрос твой возвращает анонимный тип. А их то как раз описать невозможно.
EC>И какой синтаксис тебе видится? На манер анонимных делегатов?
Если уж они пошли по пути именования полей анонимных типов, то можно использовать синтаксис типа:
Здравствуйте, EvilChild, Вы писали:
VD>>Глобальная глупость решения МС в том, что анонимные типы нельзя будет описать. EC>А какой смысл в описании анонимных типов? Можешь пример использования привести? EC>И какой синтаксис тебе видится? На манер анонимных делегатов?
Главное, что проблема стоит выеденного яйца. Вариант туплов в Н не требует никакой рантайм поддержки и не имеет таких проблем.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
VD>ну, и совместимасть по совпадению типа и имени поля.
По типу было бы достаточно — структурная эквивалентность. Было бы действительно полезно. VD>Короче огнаниченная утиная типизация.
Утиная типизация вроде как предполагает позднее связывание, если не брать в расчёт C++ templates,
а здесь всё статически можно проверить или я что-то путаю?
Здравствуйте, IT, Вы писали:
IT>Главное, что проблема стоит выеденного яйца. Вариант туплов в Н не требует никакой рантайм поддержки и не имеет таких проблем.
И при этом CLS compliant?
Можешь привести пример использования?
Здравствуйте, EvilChild, Вы писали:
IT>>Главное, что проблема стоит выеденного яйца. Вариант туплов в Н не требует никакой рантайм поддержки и не имеет таких проблем. EC>И при этом CLS compliant?
Дык без проблем.
EC>Можешь привести пример использования?
Можно даже больше чем пример. Tuples в Н представляют собой структуры/классы следудующего вида:
public struct Tuple[T1, T2]
{
public field0 : T1;
public field1 : T2;
}
public struct Tuple[T1, T2, T3]
{
public field0 : T1;
public field1 : T2;
public field1 : T3;
}
что в переводе на C# означает
public struct Tuple<T1, T2>
{
public T1 field0;
public T2 field1;
}
Именно так эти структуры и видны из внешнего кода. Сам же компилятор просто обеспечивает встроенную, более удобную работу с этими структурами.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Именно так эти структуры и видны из внешнего кода. Сам же компилятор просто обеспечивает встроенную, более удобную работу с этими структурами.
Т.е. когда мы возвращаем экземпляр анонимного типа, компилятор молчаливо создаёт в метаданных новый тип и это дело можно спокойно юзать в публичных интерфейсах сборки? Имена наверное стрёмные? Как у перечислителей, что C# компилятор создаёт? А если мы из 2х методов возвращаем структурно эквивалентные типы он их сведёт к одному в метаданных?
Здравствуйте, EvilChild, Вы писали:
IT>>Именно так эти структуры и видны из внешнего кода. Сам же компилятор просто обеспечивает встроенную, более удобную работу с этими структурами. EC>Т.е. когда мы возвращаем экземпляр анонимного типа, компилятор молчаливо создаёт в метаданных новый тип и это дело можно спокойно юзать в публичных интерфейсах сборки? Имена наверное стрёмные? Как у перечислителей, что C# компилятор создаёт? А если мы из 2х методов возвращаем структурно эквивалентные типы он их сведёт к одному в метаданных?