WolfHound пишет:
E>> Просто я пришел из мира C++,Ruby,Python E>> и захотелось привычного Думал есть какие-нибудь магические имена E>> методов, вроде apply и update в Scala. > Перегрузка () это от отсутствия нормальных замыканий. > В немерле есть нормальные замыкания. > Пора избавлятся от дурных привычек.
Категорично Это в Python, в Scala или в Ruby нету нормальных замыканий?
На самом деле я обычно перегружаю скобки для объектов с одной
единственной основной операцией, например:
format = TextFormatter(width=60)
out = format("bla-bla-bla")
format.width = 80
out = format("foo-bar-foo")
Если бы я спросил, как написать подобное в Nemerle, мне наверняка
ответили бы не выпендриваться и написать:
def formatter = TextFormatter(width=60)
mutable out = formatter.Format("bla-bla-bla")
format.Width = 80
out = formatter.Format("foo-bar-foo")
Так что замыкания тут как бы и ни при чем...
---
Любое слишком категоричное утверждение ошибочно, включая и это.
Здравствуйте, Elifant, Вы писали:
E>Понятно, спасибо. Указанные трюки мне знакомы. Просто я пришел из мира E>C++,Ruby,Python E>и захотелось привычного Думал есть какие-нибудь магические имена E>методов, вроде E>apply и update в Scala.
Перегрузка () это от отсутствия нормальных замыканий.
В немерле есть нормальные замыкания.
Пора избавлятся от дурных привычек.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Elifant, Вы писали:
E>Возможно ли перегрузить оператор '()'? E>Неработающий пример желаемого:
E>
E>class Adder {
E> public @()(arg1: int, arg2: int): int { arg1 + arg2; }
E>};
E>def adder = Adder();
E>def sum = adder(1, 2);
E>
Как уже было сказано для такого примера класс ни к чему, можно обойтись просто функцией.
Если же надо превращать класс в функцию, то
1) можно определить метод ее возвращающий и явно вызывать его
Иванков Дмитрий пишет:
E>>Возможно ли перегрузить оператор '()'?
> Как уже было сказано для такого примера класс ни к чему, можно обойтись > просто функцией. > Если же надо превращать класс в функцию, то > 1) можно определить метод ее возвращающий и явно вызывать его > public static getAdder () : int*int->int { _ + _ } > 2) определить оператор приведения к функции > public static @: (a : Adder) : int*int->int { _ + _ } > и там, где явно будет выведено приведение к функциональному типу, > преобразование пройдет само, например: > > def f = A (); > def g (x) { x (1,1) }; > _ = g (f); > > однако просто написать f(1,1) нельзя и это может выглядеть как бага, но > по мне так фича
Понятно, спасибо. Указанные трюки мне знакомы. Просто я пришел из мира
C++,Ruby,Python
и захотелось привычного Думал есть какие-нибудь магические имена
методов, вроде
apply и update в Scala.