Здравствуйте, Gajdalager, Вы писали:
E>> Туда бы еще обобщенное программирование как в D, вообще был бы шедевр.
G>Хмм.. Ты имеешь в виду генерики (generics)? Так в скале они тоже очень неплохи, во всяком случае поудобней чем в жабе, а система вывода типов делает их использование ещё удобней.. Можно пример кода на Д? Спасибо..
Да, речь о генериках. Охотно верю тому, что в Scala генерики удобнее, чем в Java. Так же я не сомневаюсь, что все заморочки с декларацией поддерживаемых параметром шаблона интерфейсов -- следствие компонентно-ориентированного подхода, где реальное связывание кода может происходить в run-time.
Однако, если переход на Scala выполняется, как в моем случае, с C++, где обобщенное программирование совсем другое, то генерики не выглядят удобными.
Вот пример кода на Scala:
object Demo1 extends Application
{
class ValueHolder
{
def value = { 0 }
}
def doSomething[ B <: ValueHolder ]( holder: B ) {
holder.value
}
doSomething( new ValueHolder )
}
// vim:ts=2:sts=2:sw=2:expandtab
В методе Demo1.doSomething указывается, что параметром может быть либо сам ValueHolder, либо его наследник. Т.е. невозможно использовать doSomething для какого-либо другого типа, не связанного с ValueHolder отношениями наследования.
А вот аналогичный пример на D:
class ValueHolder
{
int value() { return 0; }
}
class AnotherValueHolder
{
float value() { return 0.0; }
}
void
doSomething(T)( T holder )
{
holder.value;
}
void
main()
{
doSomething( new ValueHolder );
doSomething( new AnotherValueHolder );
}
Функция doSomething может применяться к любому типу. Более того, методы ValueHolder.value и AnotherValueHolder.value не совпадают по типу возвращаемого значения.
Именно такая свобода в повторном использовании обобщенных функций в D (как и в C++) нравится мне больше, чем подход с генериками в языках Scala/Java/C#.
При этом можно заметить, насколько больше в D "синтаксического оверхеда" по сравнению с Scala (необходимость писать return, постоянные точки с запятыми) -- программы на Scala синтаксически выглядят привлекательнее