午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

[Rust開發(fā)]用可視化案例講Rust編程(1)用Rust畫個(gè)百度地圖

 godxiasad 2024-01-02 發(fā)布于北京

新年的態(tài)度

新年第一篇,表態(tài):蝦神本蝦除了是個(gè)段子手以外,還是一個(gè)技術(shù)博主……

怎么能學(xué)會(huì)Rust

如果要列舉Rust的優(yōu)勢(shì),恐怕寫個(gè)十條八條是寫不完的,而且不管寫哪條優(yōu)勢(shì),都有很多同學(xué)跳起來反駁,比如我們說Rust比C/C++內(nèi)存安全,肯定有同學(xué)說C++ 20也支持內(nèi)存安全,或者我寫C++比斯特勞斯特盧普寫得更好,寫了十年沒有發(fā)生過任何內(nèi)存泄露……
但是,先反過來,要說Rust最大的問題,恐怕沒人會(huì)反駁,包括我這種花了三次才入門,然后又做砸了兩個(gè)項(xiàng)目才勉強(qiáng)算學(xué)會(huì),能夠進(jìn)入工程級(jí)開發(fā)的新人老手……
那就是:難學(xué)!

Rust的學(xué)習(xí)曲線,號(hào)稱是所有編程語言中最陡峭的,就連Rust基金會(huì),都把降低學(xué)習(xí)曲線,當(dāng)成Rust發(fā)展的當(dāng)務(wù)之急:

原文地址:https://blog./inside-rust/2022/04/04/lang-roadmap-2024.html
(注意:不是2023才提,是每一年的roadmap,都特么要提一次,這玩意兒真的不好學(xué)……公認(rèn))
官方的說法:

many people report a sense of high "cognitive overhead" in using it, and "learning curve" remains the most common reason not to use Rust. The fact is that, even after you learn how the Rust borrow checker works, there remain a lot of "small details" that you have to get just right to get your Rust program to compile.

翻譯過來就是:這玩意兒會(huì)有很高的認(rèn)知開銷,陡峭的 學(xué)習(xí)曲線 是大家不會(huì)(沒法)使用Rust的最常見原因。

因?yàn)榧词沽私饬薘ust里面最麻煩最焦頭爛額的特性:借用檢查器所有權(quán)機(jī)制)的工作原理后,仍有許多亂七八糟的小細(xì)節(jié)需要去正確處理,否則Rust編譯器會(huì)好好的教你做人……

所以,很多公司,把Rust當(dāng)成了一個(gè)測(cè)試題,但凡能夠自學(xué)學(xué)會(huì)這個(gè)可(cao)愛(dan)的語言的,起碼自驅(qū)能力必然是MAX……
就以智商中等偏下水平的蝦神本蝦來說,學(xué)習(xí)Rust一共學(xué)了三次……
第一次花了兩個(gè)月,把書和代碼敲了一遍,自我感覺好像學(xué)會(huì)了,然后……很快啊,我告訴你,真的很快啊……(就和學(xué)英語一樣)我就忘記了……
——真的,就跟沒學(xué)一樣。
第二次,是疫情居家辦公,反正在家,所以我又用了一個(gè)來月,再次入門,而且這次還專門用Rust寫了一系列的工程,例如GRPC和Python擴(kuò)展包啥的,然后又自我感覺又行了……結(jié)果上班不超過兩個(gè)月……好吧,又忘記了。
就有第三次入門,這次我都差點(diǎn)放棄,心想愛咋咋地吧,反正遇上了,就照著網(wǎng)上的代碼ctrl + CV 吧。。。就這樣,我這個(gè)半桶水還用Rust基于PGRX寫了好幾個(gè)擴(kuò)展插件,還應(yīng)付了包括國(guó)密測(cè)評(píng)在內(nèi)的不少工作……
要不說,寫代碼,趕dead line,才是學(xué)習(xí)唯一的光……

要說我這種中等偏下的智商 + 馬上45學(xué)習(xí)能力大退化的(四舍五入知天命)的半大老頭,都最后勉勉強(qiáng)強(qiáng)算學(xué)會(huì)了,我覺得其他同學(xué)學(xué)會(huì)應(yīng)該也是沒啥問題的。
所以今天我秉持一貫說人話的原則,來和大家聊聊怎么樣更快的學(xué)會(huì)Rust(以及你想學(xué)的其他編程語言也行)

戰(zhàn)略上要藐視敵人

所有同學(xué)(哪怕類似我這種寫了十幾年代碼的老碼農(nóng)),一眼抗拒的原因,很大可能就是看到了一些大神寫的Rust典型編碼風(fēng)格的代碼,例如:
  • 引用與解引用的hello world的例子:

let reference = &4;
match reference {
&val => println!("Got a value via destructuring: {:?}", val),
}
match *reference {
val => println!("Got a value via dereferencing: {:?}", val),
}

let value = 5;
let mut mut_value = 6;
match value {
ref r => println!("Got a reference to a value: {:?}", r),
}
match mut_value {
ref mut m => {
*m += 10;
println!("We added 10. `mut_value`: {:?}", m);
},
}

  • 泛型的hello world:

impl <A: TraitB + TraitC, D: TraitE + TraitF> MyTrait<A, D>

for YourType {}


impl <A, D> MyTrait<A, D> for YourType where
A: TraitB + TraitC,
D: TraitE + TraitF {}

  • 生命周期的hello world

#[derive(Debug)]
struct Borrowed<'a> {
x: &'a i32,
}
impl<'a> Default for Borrowed<'a> {
fn default() -> Self {
Self {
x: &10,
}
}
}

就這種寫法,就算你是一個(gè)資深開發(fā)工程師,都會(huì)發(fā)懵,更別說我這種寫Python的二流碼農(nóng)了……
第一時(shí)間被勸退了有沒有。
所以,開始學(xué)習(xí)的時(shí)候,千萬別去大神們寫的標(biāo)準(zhǔn)Rust編碼風(fēng)格、模式優(yōu)美,代碼簡(jiǎn)練的所謂的優(yōu)質(zhì)開源源碼,你得從簡(jiǎn)單的看起,這樣才能真正明白是干嘛的。
為什么說看簡(jiǎn)單的能入門呢?我們下面看看兩個(gè)大家都認(rèn)為很難,但是實(shí)際上看一眼就發(fā)現(xiàn)很簡(jiǎn)單的東西,就是GDAL的源碼:
//帶弧線的幾何面積計(jì)算
double OGRCircularString::get_AreaOfCurveSegments() const
{
double dfArea = 0.0;
for (int i = 0; i < getNumPoints() - 2; i += 2)
{
const double x0 = getX(i);
const double y0 = getY(i);
const double x1 = getX(i + 1);
const double y1 = getY(i + 1);
const double x2 = getX(i + 2);
const double y2 = getY(i + 2);
double R = 0.0;
double cx = 0.0;
double cy = 0.0;
double alpha0 = 0.0;
double alpha1 = 0.0;
double alpha2 = 0.0;
if (OGRGeometryFactory::GetCurveParameters(
x0, y0, x1, y1, x2, y2, R, cx, cy, alpha0, alpha1, alpha2))
{
const double delta_alpha01 = alpha1 - alpha0;
const double delta_alpha12 = alpha2 - alpha1;
dfArea += 0.5 * R * R *
fabs(delta_alpha01 - sin(delta_alpha01) + delta_alpha12 -
sin(delta_alpha12));
}
}
return dfArea;
}
——咦,不是說GDAL/CPP很難么?(恐怕絕大部分做GIS的同學(xué),都沒有看過GDAL的源碼)為什么這個(gè)方法我能看懂?
所以,號(hào)稱特別難懂的GDAL源碼,在最核心的內(nèi)部實(shí)現(xiàn)機(jī)制上,依然是具體的功能函數(shù)組成的,而這些功能函數(shù),也沒有什么難懂的設(shè)計(jì)模式、編碼特性,就是一個(gè)個(gè)語句和表達(dá)式,完成了最基礎(chǔ)的計(jì)算任務(wù)。
——有誰第一天學(xué)英語,就是去讀風(fēng)格優(yōu)美的莎士比亞原著的?難道大家不都是從基礎(chǔ)詞匯學(xué)起么?
現(xiàn)在回過頭來,軟件的組成方式是什么?軟件最底層的啥?有同學(xué)說,當(dāng)然是指令啊——CPU指令集是軟件最底層的組織方式,所以吧啦吧啦……

好吧,不談底層,那是硬件碼農(nóng)們的領(lǐng)域,對(duì)于我們這些軟件碼農(nóng)來說,我們能夠接觸到的最底層的代碼組織模式就是——語句,每個(gè)程序,都是由執(zhí)行具體操作的語句所組成的,然后這些語句,集合起來,形成的函數(shù)(或者叫方法也行,function),而一個(gè)函數(shù)則是一個(gè)一個(gè)最基本的功能邏輯實(shí)現(xiàn)體。
所以,我們?cè)趯W(xué)習(xí)語言的時(shí)候,先不要一上來就高屋建瓴的去玩高端局,咱們得從最簡(jiǎn)單的入手,那么寫起來也就簡(jiǎn)單了。
所以這次我們通過最簡(jiǎn)單的一個(gè)學(xué)習(xí)流程,來和大家一同來學(xué)習(xí)Rust的開發(fā),別擔(dān)心,你可以沒有任何Rust的開發(fā)經(jīng)驗(yàn),但是你得有基礎(chǔ)的代碼編寫能力,不管是Java、Python、JavaScript還是C#也都行。
恩,這里寫的東西,主要是給我們GIS圈的同學(xué)看的,所以一些GIS基本概念,例如坐標(biāo)、幾何要素、點(diǎn)線面mapbox、shapefilegeojson啥的,我就不解釋了……
老規(guī)矩,先看效果,在講實(shí)現(xiàn)——用Rust繪制一個(gè)百度風(fēng)格的地圖:
(啥,你問我為什么老是繪制百度地圖,不能繪制點(diǎn)其他的風(fēng)格么?答……百度風(fēng)格挺好看的,而且最簡(jiǎn)單……)

放大之后:(為了省事,地鐵線的顏色是隨機(jī)的,這次沒有隨到好看的顏色,大家將就了吧……)

看完之后,可能有同學(xué)會(huì)問:蝦神,你這個(gè)地圖怎么雞里雞氣的(JavaScript的雞)……
好吧,Rust本身就不是用來做可視化的,他的可視化能力不能說沒有吧,起碼和沒有也差不多了……這個(gè)可視化用的是Rust封裝了plotly,然后在web上繪制出來的,就是下面這個(gè):

用Rust封裝之后,就是這個(gè):

所以,就不要在那些細(xì)節(jié)了,再說:

至于怎么實(shí)現(xiàn)的,我們下回分解。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多