LINUX.ORG.RU

ЯННП или вопросы с простыми вещами в Rust.

 


0

4

Есть вот такой код и он компилится:

#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(unused_mut)]
#![allow(dead_code)]

extern crate piston;
extern crate piston_window;
extern crate image as im;
extern crate gfx;
extern crate gfx_device_gl;
extern crate noise;
extern crate rand;

use piston_window::*;
use im::RgbaImage;
use noise::{Brownian2, perlin2};

struct Txtr {
    pos: [u32;2],
    txtr: Texture<gfx_device_gl::Resources>,
}

struct App {
	texture: Txtr,
}

const TSIZE: u32 = 64;

impl App {
	fn new( window: &mut PistonWindow ) -> Self {

		let seed = rand::random();
		let noise = Brownian2::new(perlin2, 4).wavelength(32.0);
		let img = im::RgbaImage::from_fn( 64, 64, |x, y| {
				let v = noise.apply(&seed, &[ x as f32, y as f32 ]) as f32;
				let gray = (128f32 * v + 128f32) as u8;
				im::Rgba([ gray, gray, gray, 255])
			} );

		App{
			texture: Txtr{
				pos:[0,0],
				txtr:Texture::from_image( &mut window.factory, &img, &TextureSettings::new() ).unwrap()
			},
		}
	}
}

fn main() {
	let mut window: PistonWindow = WindowSettings::new("Hello World!", (800, 600) ).build().unwrap();
	let mut app:App = App::new( &mut window );
}


Однако если мы чуть поменяем его:

struct App {
	textures: Vec<Txtr>,
}

const TSIZE: u32 = 64;

impl App {
	fn new( window: &mut PistonWindow ) -> Self {

		let mut t:Vec<Txtr> = Vec::new();

		let seed = rand::random();
		let noise = Brownian2::new(perlin2, 4).wavelength(32.0);

		for t in 0..3{

			let img = im::RgbaImage::from_fn( 64, 64, |x, y| {
					let v = noise.apply(&seed, &[ x as f32, y as f32 ]) as f32;
					let gray = (128f32 * v + 128f32) as u8;
					im::Rgba([ gray, gray, gray, 255])
				} );

			t.push( Txtr{
			 	pos:[0,0],
				txtr:Texture::from_image( &mut window.factory, &img, &TextureSettings::new() ).unwrap()
			} );
		};

		App{
			textures: t,
		}
	}
}


То получаем следующую проблему:
hello3.rs:46:6: 46:10 error: no method named `push` found for type `_` in the current scope
hello3.rs:46 			t.push( Txtr{
             			  ^~~~


ЯННП, где-то теряется тип или что?

★★★★★

Последнее исправление: WatchCat (всего исправлений: 1)
let mut t:Vec<Txtr> = Vec::new();

// Skip...

for t in 0..3{

    // Snip...

	t.push( Txtr{
		pos:[0,0],
		txtr:Texture::from_image( &mut window.factory, &img, &TextureSettings::new() ).unwrap()
	} );

Ни на какие мысли не наталкивает?

hint: переименуй переменную цикла (либо вообще используй _ вместо имени).

#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(unused_mut)]
#![allow(dead_code)]

Зачем тебе это?

Вот тебе ещё годноты: clippy, rustfmt.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 4)
Ответ на: комментарий от theNamelessOne

Ни на какие мысли не наталкивает?

facepalm.jpg твоюж

Зачем тебе это?

остатки экспериментов.

WatchCat ★★★★★
() автор топика

Vec
Txtr
u32
impl
fn
perlin2
wavelength
from_fn
f32

Кт эт гвно вбще прдумл? Сглсне бквы кнчлсь? Рки отвлсь нпсать? Vector, Texture (?), unsigned int, implements, function?

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

Txtr — личные маразмы автора, с остальным то что не так?
Вполне читабельно

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

Так часто бывает, когда для нового языка не могут запилить ИДЕ или плагин для ИДЕ. Позволяет съэкономить пару нажатий.

ya-betmen ★★★★★
()
Ответ на: комментарий от nikolnik

unsigned int

Так даже в Си давно не пишут, ибо есть stdint.

Рки отвлсь нпсать?

А ты хочешь как в жабе InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState?

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

unsigned_integer_32

Куда катится мир, люди уже не в силах написать
integer_number_without_a_sign_consisted_of_thirty_two_elementary_units_of_information

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

Справедливости ради, никто тебе в Це не запрещает написать просто unsigned. Вот с «unsigned long long» будут проблемы, да

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

ибо есть stdint.

Знавал я одного товарища, который очень любил stdint.h и использовал uint64_t для всего, включая счётчики в циклах. Особенно весело было, когда оказалось, что 32-битные машинки всё ещё живее всех живых, и поддерживать их всё-таки надо. Хорошо хоть, не микроконтроллеры какие-нибудь. int_[N] — это круто и действительно полезно, но далеко не всегда.

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от Gvidon

Знавал я одного товарища, который очень любил stdint.h и использовал uint64_t для всего, включая счётчики в циклах

Он идиот. Для счётчиков как раз и придумали size_t и uintptr_t, а для всего остального в 95% случаев хватает int32_t.

Хорошо хоть, не микроконтроллеры какие-нибудь.

Это вообще к чему? Как раз во всяких восьмибитках нужно точно знать размер переменных, а пихать везде int - вообще не стоит, ибо он 16битный при восьмибитной архитектуре.

int_[N] — это круто и действительно полезно, но далеко не всегда.

Но пруфцов ты не дал - ты просто попытался выдать недостатки погромиста за проблемы stdint'а.

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

выдать недостатки погромиста за проблемы stdint'а

Даже не знаю, «других программистов у меня для вас нет» (с)

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

Даже не знаю, «других программистов у меня для вас нет»

Да пофиг, есть или нет, к stdint'у это вообще не относится. Этот твой товарищ мог бы с тем же успехом пихать везде unsigned long long.

Так ты расскажешь, в каких случаях тебе не хватит stdint + size_t?

Esper
()
Ответ на: комментарий от Gvidon

Да, забыл упомянуть про stddef. Счётчики — size_t.

Deleted
()
Ответ на: комментарий от nikolnik

Txtr

Ты знаешь, как-то было влом писать MyCoolSuperTextureWithCoordinates

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

нет.
это неиспользованные переменные и код.
проблем не создают, просто занимают место.
но для наколеночных экспериментов это как раз вполне нормально.

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

Их точно не для счетчиков придумали.

Насчёт uintptr_t - это я погорячился. Но назначение size_t в том, чтобы вмещать размер любого объекта, а при таких раскладах счётчик - юзкейз, который был очевиден при его проектировании. Буквально моё высказывание неверно, но по сути - недалеко от истины.

P.S. Тебе никогда не надоест цепляться к словам, да?

Esper
()
Ответ на: комментарий от nikolnik

Нельзя!

Там и так выразительность уровня ассемблера, а ты предлагаешь сделать код еще длиннее!

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