Wpis z mikrobloga

piszę w c# - całkiem spoko
pisze w cpp - całkiem spoko
pisze w php, pythonie - mam pare uwag, ale spoko
kodze w html/css - spoko

napisałem hello worlda w ruście, i 3 raz mnie ten język wkurzył

1) instalacja
instalujesz dodatek do vs code
w cmd robisz specjalny nowy folder

2) oczywiście nie na dysku D który wybrałem, tylko zrobił sobie nowy folder w userach na C. najbardziej upośledzona lokalizacja

robisz tam nowe cargo
wchodzisz do tego folderu
odpalasz vs code przez code .
i dopiero łaskawie możesz pisać w ruście

3) dostałem warning, że nazwa dla pliku z poradnika jest napisana pascal casem a nie snake casem

i jeszcze miałem chwile beki jak mi windows plik .rs zinterpretował jako plik do odpalenia w gimpie

i tym, co ma być tak niesamowitym w ruście jest to, że nie możesz nic zrobić bez potwierdzenia 40 razy że tego chcesz? czy coś jeszcze rewolucyjnego robi rust, czego nie było chociażby w ansi c
#naukaprogramowania #programowanie
  • 28
@Passer93: cmake był #!$%@?, fakt.
o cargo akurat mowie ze moze miec jeszcze sens jakbym je ogarnal
mowie o samym ruscie jako języku, zwłaszcza z immutability by default i usilnym blokowaniu modyfikowaniu zmiennych. w następnej wersji za zmodyfikowanie zmiennej będziesz miał przysiady na komendzie xD
@Passer93: prawie nigdzie nigdy nie klepałem constów, i w sumie nie wiem czy kiedykolwiek miałem z tego powodu problemy. Najczęściej problemy mam przez złą logikę kodu (np. zrobię a+b zamiast a-b), przed czym mnie juz chyba rust nie chroni
@Passer93: jak stawiałem consty, to przy zmiennych typu pi, i klepałem je bardziej dla zasady ( ͡° ͜ʖ ͡°)
serio, ile razy ci się zdarzyło zrobić:

int a=5
int b=6

a=b

a chciałeś b=a, i sie przez to kod wywalił
@RedveKoronny: "Const corectness" to zancznie wiecej niż trywialny przykład który podałeś. Poza założeniami dla kompilatora dzięki czemu on może lepiej optymlizować, chodzi o semantyke programowania funkcyjnego, brak efektów ubocznych i czyste funkcje.
Mówię serio, pogadamy za 3 lata xD
@Passer93: pisze w c/cpp/c# w sumie jakies 2.5 roku, i nie widziałem tej potrzeby nigdy, ale może faktycznie sie okaże że to złoto ostateczne xD
ale chętnie się dowiem o tej optymalizacji, oraz reszcie aspektów które wypisałeś. a nóż zmienie zdanie
@RedveKoronny: Warto poczytać o const correctnes ze strony iso cpp

Żeby docenic czyste funkcje to trzeba trochę zmienić sposób myślenia o kodzie, i nauczyć się jakiegoś języka funkcyjnego. Ja polecacam Haskella i ten tutorial.

Co do optymalizacji to kompilator może założyć że wartość nie ulega zmianom, i nie musi sprawdzać jej wartości odzczytami. I to są rózne naprawdę optymalizacje, temat dość złożony. Jako prosty przykład zobacz ten kod w Godbolcie
@RedveKoronny: pisałeś może coś większego w c++? const corectness/immutability/hermetyzacja/modularyzacja czy ogólne zabranianie zachowań, które mogą zaboleć bardzo pomagają w szybkim skakaniu po kodzie i tak zwanym "lokalnym rozumowaniu". Jak mam dobry kod to mogę go analizować kawałek po kawałku. W kodzie, który pozwala na wszystko tak naprawdę trzeba mieć w głowie cały program, bo logiczna hierarchia jest zachwiana
@Saly: serio dużego nie, próbowałem pare razy napisać silnik do gier, pare prostych gierek 2d, proste algorytmy etc. ale nic serio dużego jeszcze nie pisałem, chociaż mam w planach za jakis czas
@RedveKoronny: inny trochę przykład. W C++ masz:

std::vector a = {1, 2, 3, 4, 5};
std::vector b = {6, 7, 8};

std::copy_n(a.begin(), 3, b.begin());

A chciałeś skopiować z b do a, a nie z a do b. Innym przykładem jest to, że kompilator nie może tego np. zoptymalizować dostatecznie dobrze, bo nie może założyć, że a.begin() nie pokrywa się z b.begin() (aliasing) przez co musi robić kopiowanie element po
i tym, co ma być tak niesamowitym w ruście jest to, że nie możesz nic zrobić bez potwierdzenia 40 razy że tego chcesz?


@RedveKoronny: tak, dokładnie to. Rust nie pozwala Ci strzelić sobie w stopę i gwarantuje Ci, że jeśli wyraźnie nie zaznaczysz, że w tym fragmencie strzelanie w stopę jest dozwolone, to nawet nie da Ci broni do łapki.
@RedveKoronny: No trzeba się przyzwyczaić, że wymaga trochę innych rzeczy. No ale tak jest zawsze jak się przechodzi do bardziej restrykcyjnego języka. A bardziej restrykcyjne języki z reguły pozwalają lepiej pisać kod. Jak pokażesz kod to mogę coś pomóc.
@Hauleth: ale łap

fn FindSqrt(number:f32, precision:f64)->f32{
let mut a=1.0;
let mut b=number/a;
let mut done=false; // tak, prawdopodobnie to musi być takie upośledzone
while !done{
a=(a+b)/2 as f32;
b=number/a;
if (a-b).abs()<=precision as f32 {
done=true;
}
}
return a;
}

use std::io;
fn main() {
let mut x=String::new();
io::stdin().read_line(&mut x).expect("Error reading input");
let x = x.trim().parse().expect("Error parsing number");
let i_wanna_die=FindSqrt(x, 0.0001);
println!("Sqrt is equal: {}",i_wanna_die);
let mut temp=String::new();
io::stdin().read_line(&mut temp).expect("Error reading
@RedveKoronny: proszę. Ładniej i czytelniej. Bez zbędnych as f32, bezsensownego done = true, czy innych rzeczy.

A program się nie "wywala" po skończeniu działania, tylko wyłącza. Tak jak każdy porządny program powinien zrobić.

Przy okazji poprawiłem konwencję nazewniczą (funkcje powinny mieć nazwy snake_case o czym Ciebie nawet kompilator informuje).