На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с Новым 2025 годом!

Всем удачи, успеха и благополучия!

msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (245) « Первая ... 180 181 [182] 183 184 ...  244 245  ( Перейти к последнему сообщению )  
> Есть ли будущее у DELPHI?
    Цитата korvin @
    Аналогия некорректна, да и фраза не соответствует картинке. Мусорные контейнеры кто вывозить будет? А перерабатывать мусор? Или куда ты предлагаешь девать все то искусственное, что производит человек?
    Корректна. После утилизации свободная память сразу готова для повторного использования.
      Цитата D_KEY @
      Он уничтожает объекты(именно объекты, поскольку отслеживает мусор он по недоступности объекта. Вызывает он при этом финализатор или нет - разговор отдельный.
      Но, заметь финализаторы используются в императивных языках. Там они иногда будут нужны. И это возвращает нас к разговору об опциональности GC.

      Финализаторы используются в Java и C#. В Go и CL например их нет.

      Добавлено
      Цитата D_KEY @
      Ладно, фиг с ним, давай о Go. Расскажи, почему там нельзя было сделать сборщик опциональным средством?

      Почему нельзя было? Наверняка можно было, но решили, что с ним проще.

      http://golang.org/doc/go_faq.html#garbage_collection
        Цитата korvin @
        Финализаторы используются в Java и C#. В Go и CL например их нет.

        А есть ли в Go что-то типа IDisposable из .NET? Типа using? Что-то я помню какую-то поддержку RAII, но не помню что именно...
          Цитата MyNameIsIgor @
          А есть ли в Go что-то типа IDisposable из .NET?

          В CL может и сделали. В Go не было, когда я смотрел.

          Цитата
          Типа using? Что-то я помню какую-то поддержку RAII, но не помню что именно...

          В CL - (with-что-нибудь ...)
          В Go - defer сделать-что-то-по-выходу.
            Цитата MyNameIsIgor @
            А есть ли в Go что-то типа IDisposable из .NET? Типа using? Что-то я помню какую-то поддержку RAII, но не помню что именно...

            В Go делается с помощью defer примерно так:
            ExpandedWrap disabled
              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)
              }
              Цитата korvin @
              В Go делается с помощью defer

              Ага, в общем вызов недоделанной лямбды по выходу?
              Кстати, а можно ли там указывать, выполнить ли действие в любом случае, только в случае успеха, только в случае неудачи? В D scope позволяет это делать.
                Цитата korvin @
                Аналогия некорректна, да и фраза не соответствует картинке.

                почему не корректна-то? :) если не докапываться до мелочей, суть в том, что тот, кто произвел мусор (неиспользуемую ныне память), сам же в утиль его и сдаёт. то есть, сообщает приложению, что данный блок памяти ему больше не нужен, что, в свою очередь, вовсе не значит, что приложение вернет эту память системе. а поводу обработки мусора - так это уже приложение и система решают :yes:
                Цитата Besha @
                а вот некоторые языки таки убирают

                языком вылизывают? :D
                Сообщение отредактировано: _lcf_ -
                  Цитата D_KEY @
                  Ага, в общем вызов недоделанной лямбды по выходу?

                  Что значит "недоделаной лямбды"?

                  Цитата D_KEY @
                  Кстати, а можно ли там указывать, выполнить ли действие в любом случае, только в случае успеха, только в случае неудачи? В D scope позволяет это делать.

                  эм... ты не понял, defer выполняет вызов в любом случае, он не связан с обработкой исключений.
                  Вот более подробный пример (open/write/close -- условные методы "API" по работе с файлами, все что ниже -- "пользовательский код"): http://ideone.com/AFkiyg

                  Добавлено
                  Цитата _lcf_ @
                  если не докапываться до мелочей, суть в том, что тот, кто произвел мусор (неиспользуемую ныне память), сам же в утиль его и сдаёт. то есть, сообщает приложению, что данный блок памяти ему больше не нужен, что, в свою очередь, вовсе не значит, что приложение вернет эту память системе. а поводу обработки мусора - так это уже приложение и система решают :yes:

                  Ну так а при чем тут GC?
                  ExpandedWrap disabled
                    using = getObject()
                    ...
                    using = nil // все, нам не нужен

                  В чем проблема-то?
                    Цитата korvin @
                    Что значит "недоделаной лямбды"?

                    То, что мы передаем втуда код, который будем выполнять. Но при этом это и не полноценная функция. Или нет?

                    Цитата
                    эм... ты не понял, defer выполняет вызов в любом случае, он не связан с обработкой исключений.

                    Я понял. Это и есть RAII :)
                    Просто в D к аналогичному механизму добавили возможность указывать, что действие выполняется только в случае успеха, или в случае неудачи. Ну или, как обычно, в любом случае.
                      Цитата korvin @
                      Вот более подробный пример

                      Или по-проще, используя предыдущий пример:
                      ExpandedWrap disabled
                        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) // выполнится только в случае успеха
                        }
                        ExpandedWrap disabled
                          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) - выполняется в любом случае.
                          Цитата D_KEY @
                          А вот scope(exit) - выполняется в любом случае.

                          Честно говоря, я не очень понял в какой последовательности тут что будет происходить.

                          Добавлено
                          Цитата D_KEY @
                          То, что мы передаем втуда код, который будем выполнять. Но при этом это и не полноценная функция. Или нет?

                          Я думаю, что это и не функция вовсе, а просто перестановка инструкций кода, чисто синтаксически. А defer в некотором смысле сахар, чтобы это было в удобочитаемом виде. Т.е. никаких лямбд создаваться не должно и поэтому в дефер-выражении пишется вызов функции, а не создается thunk.
                          Сообщение отредактировано: korvin -
                            Цитата korvin @
                            Цитата D_KEY @
                            А вот scope(exit) - выполняется в любом случае.

                            Честно говоря, я не очень понял в какой последовательности тут что будет происходить.

                            Суть в том, что по scope(exit) действие выполнится при выходе из текущего блока, вне зависимости от того, было исключение или нет. scope(success) выполнится при выходе из блока только в случае успеха. scope(failure) - при выходе по исключению. Это понятно :) ?

                            Добавлено
                            Цитата korvin @
                            Я думаю, что это и не функция вовсе, а просто перестановка инструкций кода, чисто синтаксически.

                            В смысле перестановка? Там же исключения еще могут быть.

                            Цитата
                            А defer в некотором смысле сахар, чтобы это было в удобочитаемом виде. Т.е. никаких лямбд создаваться не должно и поэтому в дефер-выражении пишется вызов функции, а не создается thunk.

                            Дело не в том, создаются лямбды или нет(в конце концов, если лямбда не передается куда-то еще, компилятор может ее и реально не создавать). А в том, что фактически мы передаем код.
                              Цитата D_KEY @
                              Суть в том, что по scope(exit) действие выполнится при выходе из текущего блока, вне зависимости от того, было исключение или нет. scope(success) выполнится при выходе из блока только в случае успеха. scope(failure) - при выходе по исключению. Это понятно :) ?

                              Ну меня несколько смутила похожесть названий функций, поэтому смысл происходящего мне был не очень понятен, теперь вроде разобрался, думаю в Go это выглядело бы так:
                              ExpandedWrap disabled
                                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 @
                              В смысле перестановка? Там же исключения еще могут быть.

                              Ну да, не совсем корректно выразился.
                                Цитата D_KEY @
                                Дело не в том, создаются лямбды или нет(в конце концов, если лямбда не передается куда-то еще, компилятор может ее и реально не создавать). А в том, что фактически мы передаем код.

                                На сколько я знаю, в defer так же можно передать лямбду.

                                Добавлено
                                Ну, да, вот korvin и написал.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (245) « Первая ... 180 181 [182] 183 184 ...  244 245


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,2363 ]   [ 15 queries used ]   [ Generated: 3.01.25, 04:38 GMT ]