Rust part14

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2022/02/12(土) 01:24:16.59ID:XYE+Rws6
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

日本語の情報
https://rust-jp.rs/

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

※次スレは原則>>980が立てること

前スレ
Rust part13
https://mevius.5ch.net/test/read.cgi/tech/1636247099/

0952デフォルトの名無しさん2022/05/10(火) 10:47:34.92ID:7R870FiC
Rustの目標はシステムプログラミング言語だから、C/C++に比べてマシならおーけー

0953デフォルトの名無しさん2022/05/10(火) 10:53:36.95ID:ETeJkA4C
>>951
避けるべきと言ってる人の独りよがり
根拠も示さず個人的に毛嫌いしてるだけ

0954デフォルトの名無しさん2022/05/10(火) 10:55:50.02ID:qByQ4KTB
     ,―彡 ⌒ ミ―、
    〈 〈| ´ん` |〉 〉
    \ ヽ _ / /
     /      /みんなで
     /      /ホモセックス

0955デフォルトの名無しさん2022/05/10(火) 11:02:38.08ID:6N2xTn/Z
反対!君とうんこ!君は代案コードを出さない(出せない)から無視しとけ

0956デフォルトの名無しさん2022/05/10(火) 11:45:10.69ID:iVsr+a7z
>>948
あーなんか既視感あるとおもったら菅話法だw

0957デフォルトの名無しさん2022/05/10(火) 12:14:01.31ID:RgJQNmsQ
>>933
Rustはそうやってシンプルに安全に多型に対応できるところがいいよな

0958デフォルトの名無しさん2022/05/10(火) 14:24:04.29ID:TvKAUNEE
>>945
なるほどこれがオナニー指向の思考回路か

0959デフォルトの名無しさん2022/05/10(火) 14:30:38.85ID:KWXviVB8
C言語でプログラミング入門した口だけどRustみたいな関数型言語わからなくて困ってる
例えばOCamlみたいな型推論前提で書かれているコードはどの変数がなんの型になるのかわからなくてつらい思いしている
関数型言語のプログラマはみんな自分で型を推論しながらプログラミングしてるんですか?

0960デフォルトの名無しさん2022/05/10(火) 15:01:20.61ID:ZwDW7+At
>>959
むしろ型推論してくれるからプログラマーは楽
ただしどこかで歯止めがある方が安全安心確実だからRustでは関数の入出力のみ明示する
それも例えば>>929の返り値のように型そのものではなく抽象的にトレイト名で記述も可能

もしある値(式)の型を知りたかったらプログラムで表示も可能だけど一番簡単なのは
let a: i32 = 値;
とデタラメな型名i32を宣言してやるとコンパイラがエラーとして正しい型名を教えてくれる

0961デフォルトの名無しさん2022/05/10(火) 15:32:07.15ID:7R870FiC
基本的にはIDEに型を教えてもらってたけど、慣れてくると自分でどんどん型がわかるようになる

0962デフォルトの名無しさん2022/05/10(火) 15:58:41.10ID:OJk0iRnN
>>959
VSCode+rust-analyzerなら変数の型やメソッドチェーンの途中の型が全部出るよ

0963はちみつ餃子 ◆8X2XSCHEME 2022/05/10(火) 16:07:49.23ID:dIEMLhL7
>>959
どの型に確定するのか把握しなければ使えないのだとしたら、その関数の設計が悪い。
まあ程度問題ではあるけど……。

0964デフォルトの名無しさん2022/05/10(火) 18:09:35.29ID:KWXviVB8
>>960,962,963
ほーんなるほど
今ocaml勉強しているんだけど
if式のthen節とelse節の式の型は両方一致するとか、
match式においてもすべての分岐の式の型は一致するといかいったことを把握していってるわ
それ取っ掛かりにして関数全体の型把握するようにしたい
あと分岐の片方でラムダ抽象置いて束縛変数導入したらばもう一方の分岐ではconst関数に第一引数適用したの置いて分岐全体の型を合わせるとかいうテクニックとかも他人のソースから学んだンゴ
でも他の言語に比べてocamlのソースはなかなか転がっていない印象を受けるんごねえ
あとSKIコンビネータとかの型も式から推測するのもややこしくて難しいンゴねえ

0965デフォルトの名無しさん2022/05/10(火) 20:54:08.50ID:ZAF82L15
rust-analyzerっていえばさ
俺のVSCodeをYoutuberのと見比べると、構文間違えなどのアンダーラインが出現・消滅するタイミングが違うんだよね
Youtuberらのがリアルタイムで線が引かれているのに対して、俺のは保存しないと線が引かれたり消えたりしない・・・・しかも、俺の手元ではMacでもWindowsでも一緒の症状・・・・
誰かエスパーさんいたら解決策を教えて!!!

0966デフォルトの名無しさん2022/05/10(火) 22:51:55.81ID:2aw0oc++
>>959
Rustは関数型言語じゃないぞ

0967デフォルトの名無しさん2022/05/11(水) 14:05:19.94ID:QVbHbIIW

0968デフォルトの名無しさん2022/05/11(水) 14:18:05.95ID:7mn972qD
ヤバすぎでしょ

0969デフォルトの名無しさん2022/05/11(水) 14:38:17.66ID:kRR32IfD
Rustの弱い所を突かれたね

0970デフォルトの名無しさん2022/05/11(水) 15:16:16.22ID:+W7Cltp9
>>965
俺もだわ
地味に困るんだよな

0971デフォルトの名無しさん2022/05/11(水) 16:13:08.26ID:BEPAU2f/
>>965
自動セーブにする必要があるとかじゃないの?

0972デフォルトの名無しさん2022/05/11(水) 16:47:09.56ID:0dtIdeQi
>>967
審査無しでユーザーが好きに登録できるパッケージマネージャにはよくありがちなことだな
パスワードが盗まれて正当なパッケージが置き換えられたわけじゃないからまだまし
Firefoxの拡張の中には第三者が権利を正当な形で引き継いだその後の更新でマルウェア化しているものがあるって報告があるくらいだし

0973デフォルトの名無しさん2022/05/11(水) 21:53:53.62ID:8FoK4X2I
Rustで書くと依存crateが100オーバーになるのも珍しくないから
アプリ開発者がリリース単位で常時全部チェックするのは手間がかかりすぎる

全チェックじゃなければcargo crevとかで閾値決めとくとかしかないよね

0974デフォルトの名無しさん2022/05/11(水) 21:55:30.33ID:GLo3VMpI
>>972
マルウェアというよりアクセス履歴を収集するようになったってやつでしょ

0975デフォルトの名無しさん2022/05/12(木) 03:17:07.69ID:NSKWr9J3
>>824
ホントだ
127の次でpanicした
(1_i8..).for_each(|n| print!("{n} "));
release modeではpanicではなく127の次が-128になって永久循環

0976デフォルトの名無しさん2022/05/12(木) 07:30:29.11ID:mtqXpgib
適当に作れば溢れる前に止まる

fn countup<T>(start: T) -> impl Iterator<Item=T>
where T: Clone + TryFrom<usize> + num::CheckedAdd,
{
let one = T::try_from(1).ok().unwrap();
itertools::unfold((start, true), move |(n, is_first)| {
if *is_first {
*is_first = false;
Some(n.clone())
} else {
n.checked_add(&one)
.map(|new| {
*n = new.clone();
new
})
}
})
}

fn main() {
countup(1_i8).for_each(|n| print!("{n} "));
}

0977デフォルトの名無しさん2022/05/12(木) 12:42:02.07ID:1TtHCqII
>>975
1_i8..=i8::MAXにすればいいだけ
型のMAX値までRangeFromでイテレートするなんて処理は現実のプログラムでは必要ないから

0978デフォルトの名無しさん2022/05/12(木) 13:14:32.88ID:NwXtRBWx
>>977
それは数値型にしか使えないので>>976かな

0979デフォルトの名無しさん2022/05/12(木) 14:13:04.15ID:gDKYWhkK
>>976は悪いお手本が盛り沢山
真似しちゃダメだぞ

0980デフォルトの名無しさん2022/05/12(木) 14:58:33.47ID:cuIcFT6k
Rangeをpanicしないように扱う方法ないの?
CheckedRangeみたいなやつとか

0981デフォルトの名無しさん2022/05/12(木) 15:09:03.82ID:GA/DPWpW
>>979
どのへんが問題?

0982デフォルトの名無しさん2022/05/12(木) 15:48:05.20ID:mdPskXmt
>>978
じゃcharでやってみたら?

0983デフォルトの名無しさん2022/05/12(木) 15:51:11.85ID:DUB7tBF0
>>980
Rangeはオーバーフローしないよね?
RangeFromでオーバーフローして困るなら上限を指定しないと

スレ立てもヨロ

0984デフォルトの名無しさん2022/05/12(木) 16:26:15.18ID:nCP6t6gv
>>982
もっと厳しそうなStringで>>976をやってみた
Zの個数で数を表すZ

#[derive(Debug,Clone)]
struct Z(String);
impl std::fmt::Display for Z {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl From<usize> for Z {
fn from(n: usize) -> Self {
Z("Z".repeat(n))
}
}
impl std::ops::Add for Z {
type Output = Self;
fn add(self, rhs: Self) -> Self {
Z(self.0.clone() + &(rhs.0))
}
}
impl num::CheckedAdd for Z {
fn checked_add(&self, rhs: &Self) -> Option<Self> {
Some(Z(self.0.clone() + &(rhs.0)))
}
}
fn main() {
countup(Z::from(1)).for_each(|n| println!("{n}"));
}

ちゃんと動作してZの数が増えて行くんだな

0985デフォルトの名無しさん2022/05/12(木) 16:52:07.33ID:+mjBHcs3
>>984
それは独自の型であってStringではないよ
上限までイテレートするのに上限が無い型を実装して何がしたいのかわからないが
countup(Z::from(usize::MAX))とかで確認した?

0986デフォルトの名無しさん2022/05/12(木) 16:58:46.77ID:lxDeZNmy
>>985
Rustのorphan ruleを知らないのかよ
独自の型に対してしか既存traitを実装できない規則なのでそこは独自の型で正しい

0987デフォルトの名無しさん2022/05/12(木) 17:11:29.21ID:qNZB+StZ
>>986
全くもって間違ってるよ
アプローチが間違ってるから>>976>>984みたいなものしかできない

0988デフォルトの名無しさん2022/05/12(木) 17:20:14.27ID:MHUEjPJH
>>984
“Z”を繰り返したいだけなら
(1..100).map(|n| “Z”.repeat(n))でいいのに
新しい型を作って4つも5つもトレイト実装することに何かメリットあるの?

0989デフォルトの名無しさん2022/05/12(木) 17:27:09.04ID:x3l/UcP6
>>988
抽象的な考えが出来ない人なのかな
そういうのはあくまでも例であってZを表示したいわけではないことくらい分かるでしょ

0990デフォルトの名無しさん2022/05/12(木) 17:46:52.13ID:yYN31ZGU
>>976
上限のある型を作ってトレイト境界を満たしてやるとちゃんと上限で止まるんだな

#[derive(Debug,Clone)]
struct FiveBits(usize);
impl FiveBits {
fn make(n: usize) -> Option<FiveBits> {
(n >> 5 == 0).then(|| FiveBits(n))
}
}
impl TryFrom<usize> for FiveBits {
type Error = &'static str;
fn try_from(n: usize) -> Result<Self, Self::Error> {
FiveBits::make(n).ok_or("overflow")
}
}
impl std::ops::Add for FiveBits {
type Output = Self;
fn add(self, rhs: Self) -> Self {
FiveBits::make(self.0 + rhs.0).unwrap()
}
}
impl num::CheckedAdd for FiveBits {
fn checked_add(&self, rhs: &Self) -> Option<Self> {
FiveBits::make(self.0 + rhs.0)
}
}
impl std::fmt::Display for FiveBits {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

0991デフォルトの名無しさん2022/05/12(木) 17:51:39.83ID:9RFeMFB6
>>980
Rangeは上限ありだから大丈夫
RangeFromならば>>976みたいなのでいいんじゃない?

0992デフォルトの名無しさん2022/05/12(木) 17:57:40.16ID:W5nxdksy
>>985
それは君が思い込みで勘違いをしている
>>976のイテレータを見るとchecked_addが使われているため
その型に上限が有れば上限で止まるから君の言うとおり
しかしその型に上限が無ければ(リソースの有る限り)無限に進むことになる

0993デフォルトの名無しさん2022/05/12(木) 18:12:51.67ID:evRfTR7c
>>789
> fn fizzbuzz(&self) -> FizzBuzzResult<&Self> {

その関数を使わせてもらってイテレータにしようと思ったら
参照を返しているために非Copy型に対して上手くいかなくて手詰まってしまった

0994デフォルトの名無しさん2022/05/12(木) 18:18:34.21ID:dV7c/A+s
まーた汚部屋になってきたなー

0995デフォルトの名無しさん2022/05/12(木) 18:28:55.30ID:cuIcFT6k

0996デフォルトの名無しさん2022/05/13(金) 16:05:11.97ID:QlGabNLh
梅丸

0997デフォルトの名無しさん2022/05/13(金) 16:05:37.61ID:B3PTMj0D
梅錦

0998デフォルトの名無しさん2022/05/13(金) 16:06:40.24ID:iApzi+VJ
梅初め

0999デフォルトの名無しさん2022/05/13(金) 16:07:11.25ID:cgq/NsH4
梅おろし

1000はちみつ餃子 ◆8X2XSCHEME 2022/05/13(金) 16:08:29.00ID:aOoPRZFF
>>1000 なら長門は俺の嫁

10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 90日 14時間 44分 13秒

10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php

レス数が1000を超えています。これ以上書き込みはできません。