impl UserRssItemsFilter for FilterByLastRequestData {
fn filter(&self, user: i64, rep: &String, item: &RssItem) -> bool {
let key = format!("{} {}", user, rep);
let r = self.last_request_cache.write(|db| {
let last_request: DateTime<Utc> = if let Some(last_request_str) = db.get(&key) {
DateTime::parse_from_rfc2822(&last_request_str).unwrap().into()
} else {
Utc::now() - Duration::days(2)
};
if last_request < item.created_date {
db.insert(key, item.created_date.to_rfc2822());
true
} else {
false
}
}).unwrap();
self.last_request_cache.save().unwrap();
r
}
}
impl UserRssItemsFilter for FilterByLastRequestData {
fn filter(&self, user: i64, rep: &String, item: &RssItem) -> bool {
let key = format!("{} {}", user, rep);
let last_request = match self.last_request_cache.read(|db| {
match db.get(&key) {
Some(v) => Some(DateTime::parse_from_rfc2822(v).unwrap().into()),
None => None
}
}).unwrap() {
Some(v) => v,
None => Utc::now() - Duration::days(2)
};
if last_request < item.created_date {
self.last_request_cache.write(|db| {
db.insert(key, item.created_date.to_rfc2822());
}).unwrap();
self.last_request_cache.save().unwrap();
true
} else {
false
}
}
}
use raylib::prelude::*;
fn main() {
let (mut rl, thread) = raylib::init()
.size(640, 480)
.title("Hello, World")
.build();
while !rl.window_should_close() {
let mut d = rl.begin_drawing(&thread);
d.clear_background(Color::WHITE);
d.draw_text("Hello, world!", 12, 12, 20, Color::BLACK);
}
}
Как безболезненно перейти с Python на Rust?
1) Python медленный
2) В python нет адекватного управления памятью
3) В python мне приходится испльзовать кучу мегабайт библиотек (я чувствую себя тупым и бесполезным при импортировании библеотек)
4) Python кажется игрушечным языком
5) Python не подходит род микроконтроллеры (micropython - просто игрушка)
6) Проблемы из-за GIL'а
Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си?
Новый язык программирования Раст, как заявляют, лишен этого недостатка
разве общее число ошибок не перераспределяется на другие недостатки
являются ли ошибки с памятью ошибками программиста
которые вылились бы в другое русло, не будь этой возможности ошибочного использования памяти?
pub struct MimeType {
extension: String,
charset: String,
}
impl MimeType {
pub fn new(extension: String, charset: String) -> MimeType {
return MimeType { extension, charset };
}
pub fn extension(&self) -> &String {
return &self.extension;
}
pub fn charset(&self) -> &String {
return &self.charset;
}
}
trait Exp {
fn exp(self) -> Self;
}
impl Exp for f32 {
fn exp(self) -> Self {
<f32>::exp(self)
}
}
impl Exp for f64 {
fn exp(self) -> Self {
<f64>::exp(self)
}
}
// умножаем слой на предыдущую матрицу
buf = v.mat_mul(&buf);
// результат записываем в вектор
result.push(buf);
// умножаем слой на предыдущую матрицу
buf = v.mat_mul(&buf);
// результат записываем в вектор
result.push(buf.clone());
// вектор, где будут хранится произведения матриц
let mut result = vec![];
for v in layers {
// пытаемся достать предыдущую матрицу
let previous_matrix = match result.last() {
Some(last) => last,
// а если таковой нет - ей станет входная
None => &input,
};
// умножаем слой на предыдущую (или входную) матрицу
let next_matrix = v.mat_mul(previous_matrix);
result.push(next_matrix);
}
Vec::<T>::last
возвращает Option<&T>
, которая содержит ссылку на последний элемент ветора, если таковой существует. Его сложность O(1), поэтому по поводу ухудшения производительности можно не беспокоиться.#![no_std]
, юзают мини-аллокаторы, делают panic = abort
и идут на другие лишения.