LINUX.ORG.RU

rust, lifetime specifier

 ,


0

3

Есть вот такой код на расте.

fn hsort(vec : &mut Vec<int>) -> () {
	let size = vec.len();
	struct Env {
		vec   : &Vec<int>,
		start : uint,
		size  : uint
	};
	fn getMax(env : &Env, cur : uint, maxInd: uint){
		if cur >= env.size {
			return maxInd;
		}
		let sh = cur - env.start;
		let maxInd = getMax(env, sh * 2 + 1 + env.start, maxInd);
		let maxInd = getMax(env, sh * 2 + 2 + env.start, maxInd);
		if env.vec[cur] <= env.vec[maxInd] {
			return cur;
		}
		else {
			return maxInd;
		}
	};
	let mut env = Env {
		vec : vec,
		start : 0,
		size : size
	};
	for i in range(0,size - 1){
		env.start = i;
		let ind = getMax(env,i,i);
		let a = (*vec)[ind];
		(*vec)[ind] = (*vec)[i];
		(*vec)[i] = a;
	}
}
Компилятор ругается на структуру Env. Говорит мне указать мне время жизни поля vec. Вектор, ссылка на который используется в структуре должен пережить саму структуру. Как сделать такую ссылку в структуре?

★★★★★
Ответ на: комментарий от tailgunner

Но это разве не будет означать, что вектор надо будет выпилить вместе со структурой? И что за play? P.S. использую rustc 0.13.0-nightly скачал только сегодня.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

при такой расстановке ошибок становится больше

sort.rust:49:20: 49:23 error: mismatched types: expected `&hsort::Env<'_>`, found `hsort::Env<'_>` (expected &-ptr, found struct hsort::Env)
sort.rust:49            let ind = getMax(env,i,i);
                                         ^~~
sort.rust:50:18: 50:21 error: mismatched types: expected `uint`, found `()` (expected uint, found ())
sort.rust:50            let a = (*vec)[ind];
                                       ^~~
sort.rust:51:10: 51:13 error: mismatched types: expected `uint`, found `()` (expected uint, found ())
sort.rust:51            (*vec)[ind] = (*vec)[i];
                               ^~~
sort.rust:30:11: 30:17 error: mismatched types: expected `()`, found `uint` (expected (), found uint)
sort.rust:30                    return maxInd;
                                       ^~~~~~
sort.rust:34:52: 34:58 error: mismatched types: expected `uint`, found `()` (expected uint, found ())
sort.rust:34            let maxInd = getMax(env, sh * 2 + 2 + env.start, maxInd);
                                                                         ^~~~~~
sort.rust:35:30: 35:36 error: mismatched types: expected `uint`, found `()` (expected uint, found ())
sort.rust:35            if env.vec[cur] <= env.vec[maxInd] {
                                                   ^~~~~~
sort.rust:36:11: 36:14 error: mismatched types: expected `()`, found `uint` (expected (), found uint)
sort.rust:36                    return cur;

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Знаю %) Я допинал твой код до выполнябельного состояния:

fn hsort(vec : &mut Vec<int>) -> () {
	let size = vec.len();
	struct Env<'a> {
		vec   : &'a mut Vec<int>,
		start : uint,
		size  : uint
	};
	fn getMax(env : &Env, cur : uint, maxInd: uint) -> uint {
		if cur >= env.size {
			return maxInd;
		}
		let sh = cur - env.start;
		let maxInd = getMax(env, sh * 2 + 1 + env.start, maxInd);
		let maxInd = getMax(env, sh * 2 + 2 + env.start, maxInd);
		if (*env.vec)[cur] <= (*env.vec)[maxInd] {
			return cur;
		}
		else {
			return maxInd;
		}
	};
	let mut env = Env {
		vec : vec,
		start : 0,
		size : size
	};
	for i in range(0,size - 1){
		env.start = i;
		let ind = getMax(&env,i,i);
		let a = (*env.vec)[ind];
		(*env.vec)[ind] = (*env.vec)[i];
		(*env.vec)[i] = a;
	}
}

fn main() -> () { 
    let mut v = vec!(2i, 3i, 1i);
    hsort(&mut v);
    println!("{}\n", v)
}

правда, не знаю, чего ты пытался достичь :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я просто тыкаю раст, пытаясь понять что там и как. Спаибо за вариант, а то я уж полез в unsafe блоки.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

Не, так оно не работает.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

А что ты хотел, если функция по сигнатуре возвращает () а ты явно хотел uint, ну и первая ошибка вообще очевидно как исправляться должна.

maloi ★★★★★
()
Ответ на: комментарий от quantum-troll

А чем, собственно, плох mut Vec по сравнению со срезом? Или частое использование mut идеологически неправильно?

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Потому, что Vec сам по себе — ссылочный тип, так что нечего городить на пустом месте указатели на указатели. Кроме того, так ты избавишься от постоянного Deref'а. Хранить длину в структуре не нужно, так как срез уже это делает, а может быть, можно и вовсе от структуры избавиться.
Для обмена элементов среза есть метод swap().
И попробуй расширить функцию для всех TotalOrd типов, не только uint.

Или частое использование mut идеологически неправильно?

Бессмысленная мутабельность — плохо, но здесь мутабельность нужна. Поэтому используй мутабельный срез: &mut[T] вместо &[T].

quantum-troll ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.