format!
не может вернуть &str
, потому что он всегда выделяет String
. Что можно сделать, это вернуть &str
из String
, что вы и сделали в своем коде.
Как намекнул компилятор, созданный String
сразу же удаляется после его создания, потому что он вышел из текущей области видимости, и одним из способов может быть внешняя переменная, которая не ограничена областью match
. Например :
use std::fmt::Write;
fn main() {
let mut buffer = String::with_capacity(20);
buffer.push_str("It's a ");
let x = 10;
let category = match x {
0...9 => "Between 0 and 9",
number @ 10 => {
write!(&mut buffer, "{}", number).unwrap();
buffer.as_str()
}
_ if x < 0 => "Negative",
_ => "Something else",
};
println!("{}", category);
}
Если вы хотите среду [no_std]
или не хотите выполнять динамическое распределение, вы можете взглянуть на этот ограниченный фрагмент кода:
use core::str;
fn each_digit<F>(mut number: u32, mut f: F)
where
F: FnMut(u8),
{
while number > 0 {
f((number % 10) as u8);
number /= 10;
}
}
fn main() {
const BUFFER_LEN: usize = 20;
let mut buffer = [0u8; BUFFER_LEN];
let x = 12344329;
let category = match x {
0...9 => "Between 0 and 9",
number @ 123443219 => {
let mut idx = BUFFER_LEN;
each_digit(number, |digit| {
let ascii = digit + 48;
idx -= 1;
buffer[idx] = ascii;
});
str::from_utf8(&buffer[idx..BUFFER_LEN]).unwrap()
},
_ => "Something else",
};
assert_eq!("123443219", category);
}
shutil.rmtree
может принимать функцию обработки ошибок, которая будет вызываться при возникновении проблемы с удалением файла. Вы можете использовать это для принудительного удаления проблемных файлов.
На основе http://mail.python.org/pipermail/tutor/2006-June/047551.html и http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html :
import os
import stat
import shutil
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(top, onerror=remove_readonly)
(Я не тестировал этот фрагмент, но он должен быть достаточно, чтобы вы начали)
Если вы импортируете win32api из PyWin32, вы можете использовать:
win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)
, чтобы файлы перестали быть доступными только для чтения.
На сайте ActiveState есть комментарий:
shutil.rmtree имеет свои недостатки. Хотя это правда, что во многих случаях вы можете использовать shutil.rmtree (), в некоторых случаях это не работает. Например, файлы, помеченные только для чтения в Windows, не могут быть удалены с помощью shutil.rmtree ().
Путем импорта модулей win32api и win32con из PyWin32 и добавления строки, такой как «win32api.SetFileAttributes (path, win32con.FILE_ATTRIBUTE_NORMAL») в функцию rmgeneric (), это препятствие можно преодолеть. Я использовал этот подход, чтобы исправить Сценарий hot-backup.py в Subversion 1.4, поэтому он будет работать под Windows. Спасибо за рецепт.
Я не использую Windows, поэтому не могу проверить, работает это или нет.
Это, вероятно, будет исправлено с выпуском Python 3.5 (в настоящее время - июнь 2015 г. - все еще в разработке) в смысле указания на это в документации.
Вы можете найти отчет об ошибке здесь . И это является соответствующим набором изменений.
См. Недавно добавленный пример из документов Python 3.5 :
import os, stat
import shutil
def remove_readonly(func, path, _):
"Clear the readonly bit and reattempt the removal"
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(directory, onerror=remove_readonly)
. Вот вариант того, что написал Стив, он использует тот же базовый механизм, и этот протестирован : -)