Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.148.108.174] |
|
Страницы: (245) « Первая ... 180 181 [182] 183 184 ... 244 245 ( Перейти к последнему сообщению ) |
Сообщ.
#2716
,
|
|
|
Цитата korvin @ Корректна. После утилизации свободная память сразу готова для повторного использования. Аналогия некорректна, да и фраза не соответствует картинке. Мусорные контейнеры кто вывозить будет? А перерабатывать мусор? Или куда ты предлагаешь девать все то искусственное, что производит человек? |
Сообщ.
#2717
,
|
|
|
Цитата D_KEY @ Он уничтожает объекты(именно объекты, поскольку отслеживает мусор он по недоступности объекта. Вызывает он при этом финализатор или нет - разговор отдельный. Но, заметь финализаторы используются в императивных языках. Там они иногда будут нужны. И это возвращает нас к разговору об опциональности GC. Финализаторы используются в Java и C#. В Go и CL например их нет. Добавлено Цитата D_KEY @ Ладно, фиг с ним, давай о Go. Расскажи, почему там нельзя было сделать сборщик опциональным средством? Почему нельзя было? Наверняка можно было, но решили, что с ним проще. http://golang.org/doc/go_faq.html#garbage_collection |
Сообщ.
#2718
,
|
|
|
Цитата korvin @ Финализаторы используются в Java и C#. В Go и CL например их нет. А есть ли в Go что-то типа IDisposable из .NET? Типа using? Что-то я помню какую-то поддержку RAII, но не помню что именно... |
Сообщ.
#2719
,
|
|
|
Цитата MyNameIsIgor @ А есть ли в Go что-то типа IDisposable из .NET? В CL может и сделали. В Go не было, когда я смотрел. Цитата Типа using? Что-то я помню какую-то поддержку RAII, но не помню что именно... В CL - (with-что-нибудь ...) В Go - defer сделать-что-то-по-выходу. |
Сообщ.
#2720
,
|
|
|
Цитата MyNameIsIgor @ А есть ли в Go что-то типа IDisposable из .NET? Типа using? Что-то я помню какую-то поддержку RAII, но не помню что именно... В Go делается с помощью defer примерно так: func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } defer src.Close() dst, err := os.Create(dstName) if err != nil { return } defer dst.Close() return io.Copy(dst, src) } |
Сообщ.
#2721
,
|
|
|
Ага, в общем вызов недоделанной лямбды по выходу? Кстати, а можно ли там указывать, выполнить ли действие в любом случае, только в случае успеха, только в случае неудачи? В D scope позволяет это делать. |
Сообщ.
#2722
,
|
|
|
почему не корректна-то? если не докапываться до мелочей, суть в том, что тот, кто произвел мусор (неиспользуемую ныне память), сам же в утиль его и сдаёт. то есть, сообщает приложению, что данный блок памяти ему больше не нужен, что, в свою очередь, вовсе не значит, что приложение вернет эту память системе. а поводу обработки мусора - так это уже приложение и система решают языком вылизывают? |
Сообщ.
#2723
,
|
|
|
Цитата D_KEY @ Ага, в общем вызов недоделанной лямбды по выходу? Что значит "недоделаной лямбды"? Цитата D_KEY @ Кстати, а можно ли там указывать, выполнить ли действие в любом случае, только в случае успеха, только в случае неудачи? В D scope позволяет это делать. эм... ты не понял, defer выполняет вызов в любом случае, он не связан с обработкой исключений. Вот более подробный пример (open/write/close -- условные методы "API" по работе с файлами, все что ниже -- "пользовательский код"): http://ideone.com/AFkiyg Добавлено Цитата _lcf_ @ если не докапываться до мелочей, суть в том, что тот, кто произвел мусор (неиспользуемую ныне память), сам же в утиль его и сдаёт. то есть, сообщает приложению, что данный блок памяти ему больше не нужен, что, в свою очередь, вовсе не значит, что приложение вернет эту память системе. а поводу обработки мусора - так это уже приложение и система решают Ну так а при чем тут GC? using = getObject() ... using = nil // все, нам не нужен В чем проблема-то? |
Сообщ.
#2724
,
|
|
|
Цитата korvin @ Что значит "недоделаной лямбды"? То, что мы передаем втуда код, который будем выполнять. Но при этом это и не полноценная функция. Или нет? Цитата эм... ты не понял, defer выполняет вызов в любом случае, он не связан с обработкой исключений. Я понял. Это и есть RAII Просто в D к аналогичному механизму добавили возможность указывать, что действие выполняется только в случае успеха, или в случае неудачи. Ну или, как обычно, в любом случае. |
Сообщ.
#2725
,
|
|
|
Цитата korvin @ Вот более подробный пример Или по-проще, используя предыдущий пример: func CopyFile(dstName, srcName string) (written int64, err error) { ... dst, err := os.Create(dstName) if err != nil { return // выполнится только в случае фейла } defer dst.Close() // выполнится стопудова, но только если не было фейла выше по коду // т.е. если фейл был в Create, то не выполнится. return io.Copy(dst, src) // выполнится только в случае успеха } |
Сообщ.
#2726
,
|
|
|
class Mailer { void Send(Message msg) { { char[] origTitle = msg.Title(); scope(exit) msg.SetTitle(origTitle); msg.SetTitle("[Sending] " ~ origTitle); Copy(msg, "Sent"); } scope(success) SetTitle(msg.ID(), "Sent", msg.Title); scope(failure) Remove(msg.ID(), "Sent"); SmtpSend(msg); // do the least reliable part last } } А вот scope(exit) - выполняется в любом случае. |
Сообщ.
#2727
,
|
|
|
Цитата D_KEY @ А вот scope(exit) - выполняется в любом случае. Честно говоря, я не очень понял в какой последовательности тут что будет происходить. Добавлено Цитата D_KEY @ То, что мы передаем втуда код, который будем выполнять. Но при этом это и не полноценная функция. Или нет? Я думаю, что это и не функция вовсе, а просто перестановка инструкций кода, чисто синтаксически. А defer в некотором смысле сахар, чтобы это было в удобочитаемом виде. Т.е. никаких лямбд создаваться не должно и поэтому в дефер-выражении пишется вызов функции, а не создается thunk. |
Сообщ.
#2728
,
|
|
|
Цитата korvin @ Цитата D_KEY @ А вот scope(exit) - выполняется в любом случае. Честно говоря, я не очень понял в какой последовательности тут что будет происходить. Суть в том, что по scope(exit) действие выполнится при выходе из текущего блока, вне зависимости от того, было исключение или нет. scope(success) выполнится при выходе из блока только в случае успеха. scope(failure) - при выходе по исключению. Это понятно ? Добавлено Цитата korvin @ Я думаю, что это и не функция вовсе, а просто перестановка инструкций кода, чисто синтаксически. В смысле перестановка? Там же исключения еще могут быть. Цитата А defer в некотором смысле сахар, чтобы это было в удобочитаемом виде. Т.е. никаких лямбд создаваться не должно и поэтому в дефер-выражении пишется вызов функции, а не создается thunk. Дело не в том, создаются лямбды или нет(в конце концов, если лямбда не передается куда-то еще, компилятор может ее и реально не создавать). А в том, что фактически мы передаем код. |
Сообщ.
#2729
,
|
|
|
Цитата D_KEY @ Суть в том, что по scope(exit) действие выполнится при выходе из текущего блока, вне зависимости от того, было исключение или нет. scope(success) выполнится при выходе из блока только в случае успеха. scope(failure) - при выходе по исключению. Это понятно ? Ну меня несколько смутила похожесть названий функций, поэтому смысл происходящего мне был не очень понятен, теперь вроде разобрался, думаю в Go это выглядело бы так: func (m Mailer) Send(msg Message) { origTitle := msg.Title() defer msg.SetTitle(origTitle) // anyway msg.SetTitle("[Sending] " + origTitle) Copy(msg, "Sent") defer func() { if r := recover(); r != nil { Remove(msg.ID(), "Sent") // failure } }() SmtpSend(msg) SetTitle(msg.ID(), "Sent", msg.Title()) // success } Только я бы функцию обработки ошибки вынес в отдельную, но для большего соответствия решил оставить так. Цитата D_KEY @ В смысле перестановка? Там же исключения еще могут быть. Ну да, не совсем корректно выразился. |
Сообщ.
#2730
,
|
|
|
Цитата D_KEY @ Дело не в том, создаются лямбды или нет(в конце концов, если лямбда не передается куда-то еще, компилятор может ее и реально не создавать). А в том, что фактически мы передаем код. На сколько я знаю, в defer так же можно передать лямбду. Добавлено Ну, да, вот korvin и написал. |