Сравнивал замыкания в D, Scala и Nemerle, и решил проверить как они работают с вложенными классами. Наткнулся на проблему в Ди, которая к замываниям в общем не имеет отношения.
Итак, почему такой вот код на Ди компилируется без ошибок?
int delegate() func(int x)
{
int local = x; // local variable
class Inner
{
int foo()
{
return local;
}
}
return &Inner.foo; // return inner non-static function
}
int main(char[][] args)
{
int delegate() df;
df = func(100);
int res = df();
return 0;
}
Программа естественно вылетает, и понятно почему — возвращаемая функция не имеет объекта класса (который не создавался). Но почему тогда компилятор позволяет возвратить нестатическую функцию без объекта?
В Scala подобный код не проходит (в то же время, если я создам объект и верну функцию от объекта, то все работает правильно как в D так и в Scala), в Nemerle не знаю т.к. на домашнем компе нет рабочей версии компилятора.