Здравствуйте, VladD2, Вы писали:
E>>С ковариантностью самое приятное то, что она с ходу понятна (ну в крайнем случае легко восстановить в памяти ее суть). А вот с контравариантностью лично у меня гораздо сложнее.
VD>А в чем разница? Хотя опять же не пользуйся делов то...
Формально говоря, если есть объявление ковариантности по параметру:
class Stack[+T] { ... }
и T является подтипом S, то Stack[T] является подтипом Stack[S]. Если же есть объявление контравариантности:
class Stack[-T] { ... }
и T являются подтипом S, то Stack[S] является подтипом Stack[T]. Вот такое вот объяснение.
Если же переходить на нормальный человеческий язык, то в случае контравариантности, можно делать так:
object T1 extends Application
{
import scala.collection.immutable.Stack
class Payment {}
class DangerousPayment extends Payment {}
def addPaymentTo( p: Payment, storage: Stack[Payment] ) {}
var dangerousPaymentStorage = new Stack[ DangerousPayment ]
val nextPayment = new DangerousPayment
addPaymentTo( nextPayment, dangerousPaymentStorage )
}
Здесь вызов addPaymentTo является легальным, т.к. DangerousPayment является подтипом Payment и Stack[DangerousPayment] является подтипом Stack[Payment]. Собственно, с этим все понятно и у меня никогда проблем с ковариантностью не было. А вот контравариантность -- она вроде как есть, даже в стандартной библиотеке Scala используется:
abstract trait Function1 [-T1, +R] extends java.lang.Object with scala.ScalaObject
но, блин, сходу вспомнить, что она означает и придумать какой-то пример ее использования -- не получается.
А применять или хотя бы помнить, где применять, нужно. Т.к. вариантность и ограничения на типы параметров обобщенных классов/методов -- обязательный минимум знаний для написания обобщенного кода в Scala.
Кстати, в C++ и D этих заморочек нет и в помине. Не говоря уже про динамически типизированные языки.
E>>А после релиза встал еще более важный вопрос -- Phobos или Tango. Я лично ставлю на Tango.
VD>Это библиотеки что ли?
Да. Phobos -- это стандартная библиотека, которая идет в поставке компилятора DMD. Но очень ограниченная. В частности, в ней нет таких жизнено важных для меня вещей, как mutex и condition variables. Создана и развивается силами самого Вальтера Брайта.
Tango -- это попытка создать альтернативную стандартную библиотеку для D, которая бы полностью заменила Phobos. Разрабатывается силами коммунити и, поэтому, гораздо более продвинутая, чем Phobos.
К сожалению, на данном историческом этапе они совершенно не совместимы. Т.е. нужно либо писать на Phobos и не использовать Tango, либо наоборот.
E>>Я пользуюсь C++ с 93-го года практически постоянно. А начал изучать я его с конца 91-го.
VD>Везет тебе. А страступ считает, что свременный С++ появился где-то в 1994-ом.
VD>Чем ты пользовался то?
Turbo C++ 1.0 (это где-то 92-й), затем долго Borland C++ 2.0. Где-то же в 92-м, 93-м попадался в руки Zortech C++. С 95-го еще и Watcom C++.
E>> Имхо, потраченные 2 года на освоение языка, который обеспечивает мое нормальное существование уже в течении 13-ти лет себя давным-давно окупили.
VD>Ну, до 1994-то на ПиСи компиляторов того что сейчас называют С++ попросту не было. Что то ты выдумывашь (по крайней мере с датами).
См.
свидетельства очевидцевАвтор: BulatZiganshin
Дата: 07.02.07
.
VD>В прочем, какое это отношение имеет к вопросу? Или ты намекаешь, что Скалу и/или Ди ты навереваешся изучать еще 5 лет?
Я говорил про двухлетнее изучение C++. На Scala и D я потратил где-то по году. Так что год у меня в запасе еще есть.
E>>Лудим потихоньку.
VD>Ну и как прогресс? Вот это очень интересно.
С переменным успехом. Иногда удобнее, чем на C++, иногда нет. В общем, не произошло еще такого озарения, чтобы я сам себе сказал -- вот этот язык теперь мой выбор.