Начать, спасти и убедиться в Ruby?

Для аутентификации на токенах:

  $token = null;
  $headers = apache_request_headers();
  if(isset($headers['Authorization'])){
    $matches = array();
    preg_match('/Token token="(.*)"/', $headers['Authorization'], $matches);
    if(isset($matches[1])){
      $token = $matches[1];
    }
  } 
512
задан the Tin Man 23 January 2014 в 12:57
поделиться

5 ответов

Да, убедитесь, что гарантирует, что код всегда оценивается. Вот почему он называется гарантировать . Таким образом, он эквивалентен Java и C # finally .

Общий поток begin / rescue / else / sure / end выглядит следующим образом:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
rescue SomeOtherException => some_other_variable
  # code that deals with some other exception
else
  # code that runs only if *no* exception was raised
ensure
  # ensure that this code always runs, no matter what
  # does not change the final value of the block
end

Вы можете не указывать спасение , обеспечение или иначе . Вы также можете не указывать переменные, и в этом случае вы не сможете проверить исключение в коде обработки исключений. (Что ж, вы всегда можете использовать глобальную переменную исключения для доступа к последнему исключению, которое было вызвано, но это немного взломано.) И вы можете опустить класс исключения, и в этом случае все исключения, наследуемые от StandardError будет пойман.(Обратите внимание, что это не означает, что все исключения перехватываются, потому что есть исключения, которые являются экземплярами Exception , но не StandardError . В основном это очень серьезные исключения, которые нарушить целостность программы, например SystemStackError , NoMemoryError , SecurityError , NotImplementedError , LoadError , ] SyntaxError , ScriptError , Прерывание , SignalException или SystemExit .)

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

def foo
  begin
    # ...
  rescue
    # ...
  end
end

вы пишете только

def foo
  # ...
rescue
  # ...
end

или

def foo
  # ...
ensure
  # ...
end

. То же самое относится к определениям класса и определениям модуля .

Однако в конкретном случае, о котором вы спрашиваете, на самом деле есть гораздо лучшая идиома. В общем, когда вы работаете с некоторым ресурсом, который вам нужно очистить в конце, вы делаете это, передавая блок методу, который выполняет всю очистку за вас. Он похож на блок с использованием в C #, за исключением того, что Ruby на самом деле достаточно мощный, чтобы вам не приходилось ждать, пока высшие жрецы Microsoft спустятся с горы и любезно поменяют за вас свой компилятор. В Ruby вы можете просто реализовать это самостоятельно:

# This is what you want to do:
File.open('myFile.txt', 'w') do |file|
  file.puts content
end

# And this is how you might implement it:
def File.open(filename, mode='r', perm=nil, opt=nil)
  yield filehandle = new(filename, mode, perm, opt)
ensure
  filehandle&.close
end

И что вы знаете: это уже доступно в основной библиотеке как File.open .Но это общий шаблон, который вы также можете использовать в своем собственном коде для реализации любого вида очистки ресурсов (а-ля с использованием в C #) или транзакций или чего-то еще, о чем вы можете подумать.

Единственный случай, когда это не работает, если получение и освобождение ресурса распределяются по разным частям программы. Но если он локализован, как в вашем примере, вы можете легко использовать эти блоки ресурсов.


Кстати: в современном C # использование фактически излишне, потому что вы можете реализовать блоки ресурсов в стиле Ruby самостоятельно:

class File
{
    static T open<T>(string filename, string mode, Func<File, T> block)
    {
        var handle = new File(filename, mode);
        try
        {
            return block(handle);
        }
        finally
        {
            handle.Dispose();
        }
    }
}

// Usage:

File.open("myFile.txt", "w", (file) =>
{
    file.WriteLine(contents);
});
1147
ответ дан 22 November 2019 в 22:27
поделиться

Да, Убедитесь, что вроде , наконец, гарантирует, что блок будет выполнен . Это очень полезно для того, чтобы убедиться, что критические ресурсы защищены E.G. Закрытие дескриптора файла по ошибке или выпуская мьютекс.

4
ответ дан 22 November 2019 в 22:27
поделиться

Если вы хотите убедиться, что файл закрыт, вы должны использовать блок-форму file.Open :

File.open("myFile.txt", "w") do |file|
  begin
    file << "#{content} \n"
  rescue
  #handle the error here
  end
end
14
ответ дан 22 November 2019 в 22:27
поделиться
list.min(Ordering.fromLessThan[(String, Int)](_._2 < _._2))

Что все еще слишком многословно, конечно. Я бы, наверное, объявил это как val или объект .

-121--1370742-

Если вы хотите разработать приложение VST Host в .NET, посмотрите на VST.NET

-121--643742-

Да, убедитесь, что вызывается при любых обстоятельствах. Для получения дополнительной информации см. раздел « Исключения, захват и выброс » книги Programming Ruby и выполните поиск «обеспечить».

7
ответ дан 22 November 2019 в 22:27
поделиться

Да, убедитесь, что ENSURES он запускается каждый раз, так что вам не нужно file.close в блоке start.

Кстати, хороший способ проверить:

begin
  # Raise an error here
  raise "Error!!"
rescue
  #handle the error here
ensure
  p "=========inside ensure block"
end

Вы можете проверить, чтобы увидеть, если "========= внутри гарантировать блок" будет распечатан, когда есть исключение. Затем можно прокомментировать утверждение, которое вызывает ошибку, и посмотреть, выполняется ли утверждение ensure, посмотрев, не распечатывается ли что-нибудь.

5
ответ дан 22 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: