公式
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のasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
前スレ
Rust part11
https://mevius.5ch.net/test/read.cgi/tech/1623857052/
探検
Rust part12
■ このスレッドは過去ログ倉庫に格納されています
2021/08/24(火) 22:55:27.78ID:972JwtmU
218デフォルトの名無しさん
2021/08/30(月) 08:46:37.85ID:nNe2AEIB じゃあワイはガリガリ君で
219デフォルトの名無しさん
2021/08/30(月) 09:38:42.61ID:j0aQcfY/ >>214
C++ vs Rustスレでやれと何度言っても聞かずにここでイライラしてるよな
C++ vs Rustスレでやれと何度言っても聞かずにここでイライラしてるよな
220デフォルトの名無しさん
2021/08/30(月) 10:38:26.28ID:iy37Frot 上のイテレータ関連の質問に便乗ですが、
二次元vecの各要素をv[i][j]としたときに、
jごとの総和を計算するやつをイテレータできれいに書く方法ありますか?
例えばこういうやつです
let v = vec![vec![0; n]; m];
// (vの各要素を設定)
let mut result = vec![0; n];
for i in 0..m {
for j in 0..n {
result[j] += v[i][j];
}
}
二次元vecの各要素をv[i][j]としたときに、
jごとの総和を計算するやつをイテレータできれいに書く方法ありますか?
例えばこういうやつです
let v = vec![vec![0; n]; m];
// (vの各要素を設定)
let mut result = vec![0; n];
for i in 0..m {
for j in 0..n {
result[j] += v[i][j];
}
}
221デフォルトの名無しさん
2021/08/30(月) 10:46:23.34ID:qTeljjrO >中間変数を使うか否かだけの問題だからどうでもいい話
Rustの場合、ライフタイムとオーナーシップの関係で
中間変数を使うか否かは結構重要な問題だったりする
Rustの場合、ライフタイムとオーナーシップの関係で
中間変数を使うか否かは結構重要な問題だったりする
222デフォルトの名無しさん
2021/08/30(月) 10:56:01.57ID:b2fdtQYv223デフォルトの名無しさん
2021/08/30(月) 12:15:23.57ID:OrMFDzce224デフォルトの名無しさん
2021/08/30(月) 12:35:22.36ID:iy37Frot225デフォルトの名無しさん
2021/08/30(月) 13:18:46.38ID:cyaLRDjw (0..n).map(|j| (0..m).map(|i| v[i][j]).sum()).collect()
2重forをの親子を逆転してイテレータメソッドチェーンに変換しただけという感じ
こんなことよりもっと意味のあることに頭使ったほうがいい
イテレータでとあったから上を書いたが現実にはndarray入れてsum_axis使うのがいいだろう
https://docs.rs/ndarray/0.15.3/ndarray/struct.ArrayBase.html#method.sum_axis
2重forをの親子を逆転してイテレータメソッドチェーンに変換しただけという感じ
こんなことよりもっと意味のあることに頭使ったほうがいい
イテレータでとあったから上を書いたが現実にはndarray入れてsum_axis使うのがいいだろう
https://docs.rs/ndarray/0.15.3/ndarray/struct.ArrayBase.html#method.sum_axis
226デフォルトの名無しさん
2021/08/30(月) 13:30:16.69ID:w/2FJku9 こんなかんじかな
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e302c841c8dd709418f923ea1ad07868
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e302c841c8dd709418f923ea1ad07868
227デフォルトの名無しさん
2021/08/30(月) 13:33:43.06ID:w/2FJku9 ほぼかぶってたごめん
228デフォルトの名無しさん
2021/08/30(月) 13:38:15.69ID:iy37Frot >>225-226 インデックス自体のイテレータを作るって発想がありませんでした、ありがとうございます
競プロ用ではないしndarray使うのも考えてみます
競プロ用ではないしndarray使うのも考えてみます
229デフォルトの名無しさん
2021/08/30(月) 14:45:34.31ID:07yK3Bti 汎用的には縦横入れ替えのtransposeを作っておけば色んな操作が楽かもね
イテレータ作成はサボってとりあえず関数版
fn transpose<T>(v: &Vec<Vec<T>>) -> Vec<Vec<T>> where T: Copy {
(0..v[0].len()).map(|j| v.into_iter().map(|vv| (*vv)[j]).collect::<Vec<T>>()).collect()
}
fn main() {
let v = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10,11,12]];
let w = transpose(&v);
println!("{:?}", v); // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
println!("{:?}", w); // [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
}
イテレータ作成はサボってとりあえず関数版
fn transpose<T>(v: &Vec<Vec<T>>) -> Vec<Vec<T>> where T: Copy {
(0..v[0].len()).map(|j| v.into_iter().map(|vv| (*vv)[j]).collect::<Vec<T>>()).collect()
}
fn main() {
let v = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10,11,12]];
let w = transpose(&v);
println!("{:?}", v); // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
println!("{:?}", w); // [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
}
230デフォルトの名無しさん
2021/08/30(月) 20:06:03.21ID:kOjyqHoG transposeみたいな関数用意すべきかは配列の要素数次第かなあ
たかだか1度しか読まないデータのためだけに配列全体をコピーするのはもったいないケースはありそう
たかだか1度しか読まないデータのためだけに配列全体をコピーするのはもったいないケースはありそう
231デフォルトの名無しさん
2021/08/30(月) 20:10:57.31ID:kOjyqHoG 性能気にするなら Vec<Vec<_>> の形で数値格納するのではなく
Vec<_> に格納して (i, j) -> j*n+i みたいにインデックスを変換してくれるラッパーを被せた方がよさそう
Vec<_> に格納して (i, j) -> j*n+i みたいにインデックスを変換してくれるラッパーを被せた方がよさそう
232デフォルトの名無しさん
2021/08/30(月) 20:40:55.84ID:W4wNS06G >>231
それがndarrayなのでは?
それがndarrayなのでは?
233デフォルトの名無しさん
2021/08/30(月) 20:50:30.90ID:k7vUdD10234デフォルトの名無しさん
2021/08/30(月) 21:09:01.34ID:bfTdIfIK C++ドロップアウターの吹き溜まりスレ
235デフォルトの名無しさん
2021/08/30(月) 21:16:46.70ID:Xk6FdWtE >>223
競プロではむしろ回答時間や処理速度のほうが重要なので、
あえてこういうのをイテレータで実装しようとしないよ
おれなら間違いなくforで回す。わざわざイテレータで回そうと考える時間が無駄
だけど、後から振り返って、これをイテレータで1行で簡単に表示できるんじゃないかな?と思うことはよくあるんよ。
そして、ドキュメントを見返したり、他人のソースを見て、ああこういうやり方もあるんだなと学習する
競プロは実際のコーディングに役立たないという人もいるけど、
普段、自分が利用しないメソッドや方法を発見すること、実務で役立ちそうなアルゴリズムがあることを知る
という意味では意味があると思う
競プロではむしろ回答時間や処理速度のほうが重要なので、
あえてこういうのをイテレータで実装しようとしないよ
おれなら間違いなくforで回す。わざわざイテレータで回そうと考える時間が無駄
だけど、後から振り返って、これをイテレータで1行で簡単に表示できるんじゃないかな?と思うことはよくあるんよ。
そして、ドキュメントを見返したり、他人のソースを見て、ああこういうやり方もあるんだなと学習する
競プロは実際のコーディングに役立たないという人もいるけど、
普段、自分が利用しないメソッドや方法を発見すること、実務で役立ちそうなアルゴリズムがあることを知る
という意味では意味があると思う
236デフォルトの名無しさん
2021/08/30(月) 21:24:57.91ID:zvivEi6g237デフォルトの名無しさん
2021/08/31(火) 00:14:29.47ID:NYCNDL8F238デフォルトの名無しさん
2021/08/31(火) 01:03:24.14ID:P5Wfb+Ix 今日もまたこのパターンw
ヤバいやつっすね
ヤバいやつっすね
239デフォルトの名無しさん
2021/08/31(火) 01:24:07.51ID:uga9Wpe3 たまにLKMLのURL貼られるけどURLだけ貼られてもなんもわからん
240デフォルトの名無しさん
2021/08/31(火) 09:11:07.02ID:7zPv8PJ6 >>235
最適化まで考えるならforなんだろうけど、iterやcollectなんかが最適化が効かないのは今昔で、いずれは
最適化されるんじゃないだろうかと希望的観測を述べてみたり。実際gccなんかだとリンク時の最適化なんて
オプションあるし、あんまり凝ったiter/map/collect/foldだと理解に時間が掛かることはいなめない
最適化まで考えるならforなんだろうけど、iterやcollectなんかが最適化が効かないのは今昔で、いずれは
最適化されるんじゃないだろうかと希望的観測を述べてみたり。実際gccなんかだとリンク時の最適化なんて
オプションあるし、あんまり凝ったiter/map/collect/foldだと理解に時間が掛かることはいなめない
241デフォルトの名無しさん
2021/08/31(火) 09:16:05.39ID:uIcWKBVk ぼくのかんがえた最強のコードが見下されたと思って悔しかったんだろうな
図星だったからこそ競プロでは逆にこんな書き方しないとか競プロは役に立つとか自己正当化に必死になる
追い越されたらバカにされたと思って煽り運転をする人と心理と同じなのでどちらの側も少し気を付けたほうがいい
図星だったからこそ競プロでは逆にこんな書き方しないとか競プロは役に立つとか自己正当化に必死になる
追い越されたらバカにされたと思って煽り運転をする人と心理と同じなのでどちらの側も少し気を付けたほうがいい
242デフォルトの名無しさん
2021/08/31(火) 10:02:54.76ID:Mir3UPzo forよりイテレータのメソッドチェーンのほうが処理速度速かった気がするんだが
243デフォルトの名無しさん
2021/08/31(火) 10:51:36.61ID:ajUm3fTo やっていることが同じなら (最適化などによって) 結果のコードもおおよそ同じところに着地するよ。
244デフォルトの名無しさん
2021/08/31(火) 12:44:14.75ID:Iv8lyMCD C/C++でポインタを使うと速い(プラシーボ)
245デフォルトの名無しさん
2021/08/31(火) 13:28:16.71ID:ajUm3fTo せやな。 素朴なコンパイラならともかく
いまどきの最適化能力を期待できるなら
ポインタはエイリアス解析を困難にするから
むしろ足を引っ張る要素になる。
いまどきの最適化能力を期待できるなら
ポインタはエイリアス解析を困難にするから
むしろ足を引っ張る要素になる。
246デフォルトの名無しさん
2021/08/31(火) 14:25:42.76ID:SlncBcTV >>244
ポインタは適切に使えばデータ構造やアルゴリズム自体が根本的に変えることが
できるので使わない時と比べて計算オーダー自体が劇的に変化することがあり、
プラシーボではない。
Rustはその点でC/C++に勝てない事がある。
ポインタは適切に使えばデータ構造やアルゴリズム自体が根本的に変えることが
できるので使わない時と比べて計算オーダー自体が劇的に変化することがあり、
プラシーボではない。
Rustはその点でC/C++に勝てない事がある。
247デフォルトの名無しさん
2021/08/31(火) 14:28:10.16ID:SlncBcTV 例えば、動的配列であるところのVectorはポインタでアクセスしても余り
効率は良くならないが、LinkedListは構造的にポインタで連結されており、
首尾一貫して添え字アクセスを使わずに必ずポインタでノードを識別する
ようにすれば、Vectorに比べて劇的に効率アップできることがある。
それはRustではほぼ不可能。ベンチマークはこの点が反映されてない。
効率は良くならないが、LinkedListは構造的にポインタで連結されており、
首尾一貫して添え字アクセスを使わずに必ずポインタでノードを識別する
ようにすれば、Vectorに比べて劇的に効率アップできることがある。
それはRustではほぼ不可能。ベンチマークはこの点が反映されてない。
248デフォルトの名無しさん
2021/08/31(火) 15:24:34.70ID:8qO1h2Cp249デフォルトの名無しさん
2021/08/31(火) 21:08:01.25ID:NYCNDL8F >>240
最適化ではなくて、forを利用してindexで回さないとできないことが山ほどあるんだよね
例えば、二分探索や三分探索とか
foreach(a in vec)で順繰りに回せる処理ならいいけど、
そういう処理ではできないこともあるので、
forで回す前提で考えたほうが、あとから修正する余地があるので、どうしてもforでindexで回すことになる
これは、イテレータのほうがループが速いというのと、また別の問題
最適化ではなくて、forを利用してindexで回さないとできないことが山ほどあるんだよね
例えば、二分探索や三分探索とか
foreach(a in vec)で順繰りに回せる処理ならいいけど、
そういう処理ではできないこともあるので、
forで回す前提で考えたほうが、あとから修正する余地があるので、どうしてもforでindexで回すことになる
これは、イテレータのほうがループが速いというのと、また別の問題
250デフォルトの名無しさん
2021/08/31(火) 21:25:16.59ID:RnSwjxg3 rustのforは他言語でいうforeach(a in vec)やろ
251デフォルトの名無しさん
2021/08/31(火) 21:26:56.02ID:RnSwjxg3 そもそも二分探索を普通forで実装しないだろ
252デフォルトの名無しさん
2021/08/31(火) 21:39:55.47ID:KWeLtswn for each 的なループで書いたものを二分探索に直す時点でプログラムとしては別物になりそうなんだけど
元のコードを iter じゃなく index アクセスするコードにしておくことでこの書き換えがどれほど楽になるのかね
まあここまでくると個人の好みの話なのでお好きにどうぞとしか言えないが
元のコードを iter じゃなく index アクセスするコードにしておくことでこの書き換えがどれほど楽になるのかね
まあここまでくると個人の好みの話なのでお好きにどうぞとしか言えないが
253デフォルトの名無しさん
2021/08/31(火) 21:59:30.62ID:Gkdn/HXs Rustのfor式を理解してなかったんかーいっ!!!
254デフォルトの名無しさん
2021/08/31(火) 22:43:09.54ID:JHqwYLi1 >>250
それは違う
まず1点目
リスト対するfor文をforeachと書かずforと書く言語の方が非常に多く一般的
C++もJavaもJavaScriptもPythonもRubyもAwkもshもリストに対してfor文
次に2点目
Rustのfor文はIterator loopと明確に書かれてるようにリストや配列に対してではなくイテレータ正確にはIntoIteratorを実装するものに対して
それは違う
まず1点目
リスト対するfor文をforeachと書かずforと書く言語の方が非常に多く一般的
C++もJavaもJavaScriptもPythonもRubyもAwkもshもリストに対してfor文
次に2点目
Rustのfor文はIterator loopと明確に書かれてるようにリストや配列に対してではなくイテレータ正確にはIntoIteratorを実装するものに対して
255デフォルトの名無しさん
2021/08/31(火) 23:30:53.76ID:lNvHqkvm もうコイツどうにかしてくれwww
256デフォルトの名無しさん
2021/08/31(火) 23:44:40.84ID:Gy6+Rq7L257デフォルトの名無しさん
2021/08/31(火) 23:52:15.67ID:3ENBWRwS 調べたのにfor式を理解できんかったんかーいっ!!!
258デフォルトの名無しさん
2021/08/31(火) 23:54:52.53ID:uga9Wpe3 Rustのforで二分探索ってどうやるのか気になる
259デフォルトの名無しさん
2021/08/31(火) 23:56:09.61ID:cANa6qyq どうせ自分で二分探索なんか実装しないだろ
気にするな
標準ライブラリ使え
気にするな
標準ライブラリ使え
260デフォルトの名無しさん
2021/09/01(水) 01:38:57.54ID:iOouKnxp261デフォルトの名無しさん
2021/09/01(水) 01:59:11.36ID:p49DyIKy262デフォルトの名無しさん
2021/09/01(水) 03:29:00.40ID:MtyAaHfZ >>254
もちろんRustのforはVecや配列に適用じゃなくてイテレータに適用
だからリスト処理しかできない言語のfor/foreachよりはRustのforは適用範囲が広い
しかし
>>258
for以前に確定しているデータしかイテレータ内で使えなくて
これはforの中で算出されたデータを借用規則によりイテレータに反映させられないためで
forの中でif分岐などする形で二分探索は無理と思う
しかし
元々の>>249が言う
「forを利用してindexで回さないとできないことが山ほどある。例えば二分探索とか」も間違い
このforはC言語などのfor (index初期値; index条件判定; index更新)を指しているが
二分探索はindex更新が状況により増減変化するためfor(;;)文を使えない
無理やりにforを使っても更新項がないため最初からwhile文を使うのが正解
つまりCでもRustでも同じでforではなくwhileが使われる
もちろんRustのforはVecや配列に適用じゃなくてイテレータに適用
だからリスト処理しかできない言語のfor/foreachよりはRustのforは適用範囲が広い
しかし
>>258
for以前に確定しているデータしかイテレータ内で使えなくて
これはforの中で算出されたデータを借用規則によりイテレータに反映させられないためで
forの中でif分岐などする形で二分探索は無理と思う
しかし
元々の>>249が言う
「forを利用してindexで回さないとできないことが山ほどある。例えば二分探索とか」も間違い
このforはC言語などのfor (index初期値; index条件判定; index更新)を指しているが
二分探索はindex更新が状況により増減変化するためfor(;;)文を使えない
無理やりにforを使っても更新項がないため最初からwhile文を使うのが正解
つまりCでもRustでも同じでforではなくwhileが使われる
263デフォルトの名無しさん
2021/09/01(水) 05:05:49.84ID:W5DSGMZK こんな感じ?
fn binary_search<T>(array: &[T], target: T) -> Option<usize> where T: std::cmp::PartialOrd {
let mut left = 0;
let mut right = array.len() as i32 - 1;
while left <= right {
let mid = (left + right) / 2;
if array[mid as usize] == target {
return Some(mid as usize);
} else if array[mid as usize] < target {
left = mid + 1;
} else {
right = mid - 1;
}
}
return None;
}
Cで書いてもほぼ同じコードになるね
同じコードで任意の型に楽に対応できるRustの方が有利かな
fn binary_search<T>(array: &[T], target: T) -> Option<usize> where T: std::cmp::PartialOrd {
let mut left = 0;
let mut right = array.len() as i32 - 1;
while left <= right {
let mid = (left + right) / 2;
if array[mid as usize] == target {
return Some(mid as usize);
} else if array[mid as usize] < target {
left = mid + 1;
} else {
right = mid - 1;
}
}
return None;
}
Cで書いてもほぼ同じコードになるね
同じコードで任意の型に楽に対応できるRustの方が有利かな
264デフォルトの名無しさん
2021/09/01(水) 08:56:44.94ID:wrwogreT265デフォルトの名無しさん
2021/09/01(水) 19:34:58.07ID:8EcW0Jj4 >>249
お、249は俺だ。
言われてみれば確かに二分探索でforはないなww
while max-min > 0 とかそんな感じだった。飲んで書いてたからすまんすまん
でも、イテレータでなくてindexでやるほうが便利なことのほうが多いのは事実なのよ
動的計画法で現在の参照している配列の前後の内容を参照する時とか
お、249は俺だ。
言われてみれば確かに二分探索でforはないなww
while max-min > 0 とかそんな感じだった。飲んで書いてたからすまんすまん
でも、イテレータでなくてindexでやるほうが便利なことのほうが多いのは事実なのよ
動的計画法で現在の参照している配列の前後の内容を参照する時とか
266デフォルトの名無しさん
2021/09/01(水) 20:35:07.40ID:+RqlKI+M indexが便利なことの "方が" 多いの?
indexが便利なこと "も" 多いならわかる
indexが便利なこと "も" 多いならわかる
267デフォルトの名無しさん
2021/09/01(水) 21:13:02.22ID:8EcW0Jj4 自分は競プロでRustを使ってるけど、その範囲では圧倒的にindex
268デフォルトの名無しさん
2021/09/01(水) 21:38:57.15ID:8EcW0Jj4 うーん、こういうのはイテレータだけでもいけるね
ttps://atcoder.jp/contests/abc138/tasks/abc138_d
static mut tree_list: Vec<(i64, i64)> = Vec::new();
static mut job_list: Vec<(i64, i64)> = Vec::new();
static mut res_list: Vec<i64> = Vec::new();
fn main() {
unsafe {
input! {
edge: i64, job: i64,
tree_list0: [(i64, i64); edge-1],
job_list0: [(i64, i64); job],
}
tree_list = tree_list0;
job_list = job_list0;
res_list = vec![0_i64; edge as usize + 1];
unsafe fn calc(index: i64, count: i64) {
res_list[index as usize] += count;
for &(a, b) in &tree_list { if a == index { calc(b, count); } }
}
for &(a, b) in &job_list { calc(a, b); }
for i in 1..res_list.len() { print!("{} ", res_list[i]); }
println!();
}
}
ttps://atcoder.jp/contests/abc138/tasks/abc138_d
static mut tree_list: Vec<(i64, i64)> = Vec::new();
static mut job_list: Vec<(i64, i64)> = Vec::new();
static mut res_list: Vec<i64> = Vec::new();
fn main() {
unsafe {
input! {
edge: i64, job: i64,
tree_list0: [(i64, i64); edge-1],
job_list0: [(i64, i64); job],
}
tree_list = tree_list0;
job_list = job_list0;
res_list = vec![0_i64; edge as usize + 1];
unsafe fn calc(index: i64, count: i64) {
res_list[index as usize] += count;
for &(a, b) in &tree_list { if a == index { calc(b, count); } }
}
for &(a, b) in &job_list { calc(a, b); }
for i in 1..res_list.len() { print!("{} ", res_list[i]); }
println!();
}
}
269デフォルトの名無しさん
2021/09/02(木) 00:21:53.48ID:nqohbFGX ところで非同期ライブラリはどれが標準になるの?
270デフォルトの名無しさん
2021/09/02(木) 01:42:02.99ID:S2XiqXH4 そりゃあれでしょ
271デフォルトの名無しさん
2021/09/02(木) 11:37:50.37ID:UEpMLVw4 名前がダセェあれか
272デフォルトの名無しさん
2021/09/02(木) 14:15:51.06ID:AObLO14s お江戸
273デフォルトの名無しさん
2021/09/02(木) 14:55:26.38ID:2FuyxSW6 >>269
futuresで行ける
futuresで行ける
274デフォルトの名無しさん
2021/09/02(木) 15:18:41.35ID:l4XbE5cZ Rustは、Tiobe index で、少し前に始めて20位に入ったが、今見たら
24位に下がってる。
このランキングの信憑性にも議論の余地はあろうが。
でも、日経の調査ではプロが使っている言語のTOPは、C/C++ということなので、
その調査とも整合はしている。
他の調査でも、CとC++を合算するとTOPか、2位になる。
24位に下がってる。
このランキングの信憑性にも議論の余地はあろうが。
でも、日経の調査ではプロが使っている言語のTOPは、C/C++ということなので、
その調査とも整合はしている。
他の調査でも、CとC++を合算するとTOPか、2位になる。
275デフォルトの名無しさん
2021/09/02(木) 15:28:38.88ID:l4XbE5cZ https://www.rust-lang.org/ja/production/users
には、Rust公式サイト(?)で製品に使っている企業名が書いてあるが、
聞いたことが無い企業が多い。それはそういうものなのかもしれないが。
には、Rust公式サイト(?)で製品に使っている企業名が書いてあるが、
聞いたことが無い企業が多い。それはそういうものなのかもしれないが。
276デフォルトの名無しさん
2021/09/02(木) 17:24:27.18ID:oZlwZEWk >>254
お前の負けやでw
お前の負けやでw
277デフォルトの名無しさん
2021/09/02(木) 17:50:16.02ID:5ahReTWB >>256
そらそろ宿題できたかい?
そらそろ宿題できたかい?
278デフォルトの名無しさん
2021/09/02(木) 18:51:20.53ID:oZlwZEWk >>277
お前の負けやでw
お前の負けやでw
279デフォルトの名無しさん
2021/09/02(木) 19:10:59.17ID:2FuyxSW6 また荒らしが来てるな
ところで非同期関数を呼ぶとfuture/promiseを返すだけでそのタイミングては実行開始しない怠惰タイプのプログラミング言語はRust以外に何があります?
ところで非同期関数を呼ぶとfuture/promiseを返すだけでそのタイミングては実行開始しない怠惰タイプのプログラミング言語はRust以外に何があります?
280デフォルトの名無しさん
2021/09/02(木) 19:14:26.82ID:rwq3+G7G281デフォルトの名無しさん
2021/09/02(木) 20:17:55.99ID:cdb/p6kF >>279
イテレータも理解してないのに他スレでRustをバカ推しすんなよな
イテレータも理解してないのに他スレでRustをバカ推しすんなよな
282デフォルトの名無しさん
2021/09/02(木) 21:18:33.70ID:5ahReTWB イテレータも理解してないアホがいるのか
283デフォルトの名無しさん
2021/09/02(木) 21:26:15.36ID:+7Q9WvZy >>282
ほぅ(for)( ^ω^)・・・
ほぅ(for)( ^ω^)・・・
284デフォルトの名無しさん
2021/09/02(木) 22:29:04.14ID:2FuyxSW6 >>269
せめてfutures::io::AsyncRead,AsyncWriteトレイトあたりで中立に互換性問題なんとかしてほしい
せめてfutures::io::AsyncRead,AsyncWriteトレイトあたりで中立に互換性問題なんとかしてほしい
285デフォルトの名無しさん
2021/09/02(木) 23:41:15.18ID:Ubg4tWaQ >>268
これじゃナイーブ過ぎて通らないでしょ
これじゃナイーブ過ぎて通らないでしょ
286デフォルトの名無しさん
2021/09/03(金) 00:54:23.74ID:2xSRfF9g >>283
いちゃラブ ((っ´ω`)♡(´ω`⊂ )) すればすぐわかるのにね
いちゃラブ ((っ´ω`)♡(´ω`⊂ )) すればすぐわかるのにね
287デフォルトの名無しさん
2021/09/03(金) 13:54:25.02ID:j8ut1qUg let a = [10, 20, 130, 40];
let v = vec!a;//←これってなんでダメなんですか?
let v = vec!a;//←これってなんでダメなんですか?
288デフォルトの名無しさん
2021/09/03(金) 14:17:04.75ID:9y+1HwQb >>287
そういう構文規則(syntax)だから。
二行目は、vec! はマクロ名で、直後からはマクロの引数列が続く。
そして、その引数列は決まった形式で書く必要があり、
vec!a という形式はそれに当てはまってない。
そういう構文規則(syntax)だから。
二行目は、vec! はマクロ名で、直後からはマクロの引数列が続く。
そして、その引数列は決まった形式で書く必要があり、
vec!a という形式はそれに当てはまってない。
289デフォルトの名無しさん
2021/09/03(金) 14:20:52.38ID:12Im1YVo >>287
vec![]の[]は配列リテラルではなくて、一般的にマクロ呼び出しは[]か()か{}で引数を渡す
なので実はvec!(1)やvec!{1}も通るのだが、配列リテラルの見た目と合わせるために普通[]が使われる
vec![]の[]は配列リテラルではなくて、一般的にマクロ呼び出しは[]か()か{}で引数を渡す
なので実はvec!(1)やvec!{1}も通るのだが、配列リテラルの見た目と合わせるために普通[]が使われる
291デフォルトの名無しさん
2021/09/03(金) 15:36:22.40ID:eAcQJHwr Cのvolatileって低レイヤで多用されるにもかかわらず実装依存なんだな
処理系依存の属性値的なのと同じようなもんか
Rustはcoreの中にvolatileアクセス用のメソッドが用意されている分進んでいる
処理系依存の属性値的なのと同じようなもんか
Rustはcoreの中にvolatileアクセス用のメソッドが用意されている分進んでいる
292デフォルトの名無しさん
2021/09/03(金) 15:55:22.52ID:4g+/rgm+293デフォルトの名無しさん
2021/09/03(金) 18:49:30.86ID:XJw5Azdc 何らか単純なmacroリライトとは異なるproprocessorが必要になりそうね
cとかlisp(cより遥かにまし)みたいなエラー挟み込むだけのマクロよりかは
rustのマクロはマシよね殆ど利便性は特になくcompile前にregex雑魚ver replace導入してるだけだけど
まぁ、素直なアプローチというか何というか(´・ω・`)
cとかlisp(cより遥かにまし)みたいなエラー挟み込むだけのマクロよりかは
rustのマクロはマシよね殆ど利便性は特になくcompile前にregex雑魚ver replace導入してるだけだけど
まぁ、素直なアプローチというか何というか(´・ω・`)
294デフォルトの名無しさん
2021/09/03(金) 23:47:36.72ID:g/jq2Cau rustの勉強のため自作のbashコマンドを、rustで書き直してるんですが、
コマンド置換( $(echo ) )はどうやればいいでしょうか?
Command::new('hoge').args......は調べたのですが、コマンド置換の方法が
どうしてもわかりません。
コマンド置換( $(echo ) )はどうやればいいでしょうか?
Command::new('hoge').args......は調べたのですが、コマンド置換の方法が
どうしてもわかりません。
295デフォルトの名無しさん
2021/09/04(土) 01:53:11.04ID:HZGHSQTb >>294
Command::outputでstdout取得してきてそれをコマンド列に埋め込むとか?
Command::outputでstdout取得してきてそれをコマンド列に埋め込むとか?
296デフォルトの名無しさん
2021/09/04(土) 05:20:01.42ID:iqtSb51S インタプリタを作るのでなければ置換の必要性ある?
例えばこういうことが出来ればいいんだよね?
let s = format!("今日は{}曜日です", String::from_utf8(std::process::Command::new("date").arg("+%a").env("LANG", "ja_JP.utf8").output()?.stdout)?.trim_end());
例えばこういうことが出来ればいいんだよね?
let s = format!("今日は{}曜日です", String::from_utf8(std::process::Command::new("date").arg("+%a").env("LANG", "ja_JP.utf8").output()?.stdout)?.trim_end());
297デフォルトの名無しさん
2021/09/04(土) 09:57:53.03ID:KxfCnNFO 汚いコードだなぁ
298デフォルトの名無しさん
2021/09/04(土) 12:45:59.97ID:mADKIhQi299デフォルトの名無しさん
2021/09/04(土) 14:38:37.40ID:1i5Z4ndW >>298
Command は system 関数相当じゃなくて fork/exec だから shell は関与しないと思ってたんだけど違うの?
Command は system 関数相当じゃなくて fork/exec だから shell は関与しないと思ってたんだけど違うの?
300デフォルトの名無しさん
2021/09/04(土) 17:05:10.13ID:iqtSb51S >>297
美しいコードをご教示して下さい
美しいコードをご教示して下さい
301デフォルトの名無しさん
2021/09/04(土) 17:33:46.64ID:mADKIhQi >>299
fork/execだからとかそういう問題じゃなくて、
外部コマンド使うんだったら、それは単なるラッパーだろうと
要求する機能を満たすだけなら別にそれでも良いと思うが、
勉強のためにrustで書き直すというなら違和感がある
自作コマンドの内容にもよるけど
fork/execだからとかそういう問題じゃなくて、
外部コマンド使うんだったら、それは単なるラッパーだろうと
要求する機能を満たすだけなら別にそれでも良いと思うが、
勉強のためにrustで書き直すというなら違和感がある
自作コマンドの内容にもよるけど
302デフォルトの名無しさん
2021/09/04(土) 19:48:22.92ID:FwiYtexa303デフォルトの名無しさん
2021/09/04(土) 20:41:42.28ID:HZGHSQTb >>301
shell を作ってるんだから外部コマンド呼び出してなんぼだと思うんだが
shell を作ってるんだから外部コマンド呼び出してなんぼだと思うんだが
305デフォルトの名無しさん
2021/09/04(土) 22:09:11.34ID:HZGHSQTb >>304
自作のbashコマンドを自作の bash 互換シェルと読んでコマンド置換の仕組みを作ろうとしてるのかと思ったけど
もしかして bash スクリプトで書いたコマンドのことだったりする?
それにしたって外部コマンド含めて自作する必要はないと思うが
自作のbashコマンドを自作の bash 互換シェルと読んでコマンド置換の仕組みを作ろうとしてるのかと思ったけど
もしかして bash スクリプトで書いたコマンドのことだったりする?
それにしたって外部コマンド含めて自作する必要はないと思うが
306デフォルトの名無しさん
2021/09/04(土) 23:54:37.12ID:iqtSb51S なるほど
>>296と書くのではRustで書き直したことになっていないとはそういう意味か
これでいいのかな
use locale::Time;
use chrono::{Local, Datelike};
let s = format!("今日は{}曜日です", Time::load_user_locale().unwrap().short_day_name(Local::now().date().weekday().num_days_from_sunday() as usize));
>>296と書くのではRustで書き直したことになっていないとはそういう意味か
これでいいのかな
use locale::Time;
use chrono::{Local, Datelike};
let s = format!("今日は{}曜日です", Time::load_user_locale().unwrap().short_day_name(Local::now().date().weekday().num_days_from_sunday() as usize));
307デフォルトの名無しさん
2021/09/05(日) 01:20:41.47ID:lJqHVJAL $ foo=$(bar $(baz))
↓
let foo = bar(baz())
↓
let foo = bar(baz())
308デフォルトの名無しさん
2021/09/05(日) 14:42:42.92ID:5vCe2TIK >>294
>rustの勉強のため自作のbashコマンドを、rustで書き直し
https://github.com/uutils/coreutils/blob/master/src/uu/echo/src/echo.rs
> コマンド置換( $(echo ) )はどうやればいいでしょうか?
https://www.joshmcguigan.com/blog/build-your-own-shell-rust/
https://zenn.dev/garebare/articles/a463257c447fa9
独自shellスクリプトをbashやzshのように実行する際は標準入力を逐次読むインタラクティブシェルの
動作モードの他に第一引数のスクリプトパスを受け取り連続的に動作するようにしなければなりません。
上記のサンプルのように変数やコマンド置換を展開(子プロを作って実行結果を保持する)パーサーが
必要になります。(上の例ではリダイレクトやパイプなどしか処理していませんが)またファイル先頭の
#!/bin/shと同じようにshebangを認識するのはOSが行います。
そのほかにもifに使われるや"["もしくはtestなどは大昔はコマンドでしたが、現在は多くのシェルでは
組み込みのビルトインコマンドになっています。
また現在でもbashなどでクラッシュさせる脆弱性が発見されていますが、GNU bashの場合はパーサーは
手書きではなく、parse.yなどのyaccです
>rustの勉強のため自作のbashコマンドを、rustで書き直し
https://github.com/uutils/coreutils/blob/master/src/uu/echo/src/echo.rs
> コマンド置換( $(echo ) )はどうやればいいでしょうか?
https://www.joshmcguigan.com/blog/build-your-own-shell-rust/
https://zenn.dev/garebare/articles/a463257c447fa9
独自shellスクリプトをbashやzshのように実行する際は標準入力を逐次読むインタラクティブシェルの
動作モードの他に第一引数のスクリプトパスを受け取り連続的に動作するようにしなければなりません。
上記のサンプルのように変数やコマンド置換を展開(子プロを作って実行結果を保持する)パーサーが
必要になります。(上の例ではリダイレクトやパイプなどしか処理していませんが)またファイル先頭の
#!/bin/shと同じようにshebangを認識するのはOSが行います。
そのほかにもifに使われるや"["もしくはtestなどは大昔はコマンドでしたが、現在は多くのシェルでは
組み込みのビルトインコマンドになっています。
また現在でもbashなどでクラッシュさせる脆弱性が発見されていますが、GNU bashの場合はパーサーは
手書きではなく、parse.yなどのyaccです
309デフォルトの名無しさん
2021/09/05(日) 19:37:48.09ID:vqQF7q4/ シェル自体をRustで実装する話なん?
310デフォルトの名無しさん
2021/09/05(日) 20:23:09.21ID:qXYO1Gcj 想定外。
シェルスクリプトで書かれてる日常ツール類を、高速化&練習ついでにRust化、ってのはよくある話なので、今回もそういうことかと想定してた。
シェルスクリプトで書かれてる日常ツール類を、高速化&練習ついでにRust化、ってのはよくある話なので、今回もそういうことかと想定してた。
311デフォルトの名無しさん
2021/09/05(日) 20:31:50.21ID:Mq9n6pyZ grepの書き換えとか入門用テキストあるあるだしな俺もそれかと思ってたw
インタープリターみたいの作りたいなら単純に考えて$(.+)みたいの発見し次第rustで書かれたプログラムに書き換え
この際$(.+)の.+の部分にもrust書き換えプログラムを同様に適用のrecursiveな奴考えるな
match等でregex構文が扱いやすい分rust native interpreterみたいの造りやすそう
あとそうゆうのredosだかなんだかのrust os projectみたいのあるから見たら面白いんじゃね(´・ω・`)
インタープリターみたいの作りたいなら単純に考えて$(.+)みたいの発見し次第rustで書かれたプログラムに書き換え
この際$(.+)の.+の部分にもrust書き換えプログラムを同様に適用のrecursiveな奴考えるな
match等でregex構文が扱いやすい分rust native interpreterみたいの造りやすそう
あとそうゆうのredosだかなんだかのrust os projectみたいのあるから見たら面白いんじゃね(´・ω・`)
312デフォルトの名無しさん
2021/09/07(火) 12:42:27.81ID:O1QkM6d3 nullの可能性がある複数の参照を作りたい場合って
OptionとかRcを組み合わせるの?
縦によも横にもコードが長くなりそう
OptionとかRcを組み合わせるの?
縦によも横にもコードが長くなりそう
313デフォルトの名無しさん
2021/09/07(火) 13:22:01.93ID:J2y4//gF Option<&T> や &Option<T>でも良いかも知れないけど状況次第
可変参照にしたいなら Rc<RefCell<Option<T>>> とかになるかも
可変参照にしたいなら Rc<RefCell<Option<T>>> とかになるかも
314デフォルトの名無しさん
2021/09/07(火) 14:39:19.62ID:vfOWvkqv Rustの文化詳しくないけど、null objectは使わないの?
せっかく静的安全性にこだわっているのに、型無しのnullを使うのはこだわりが足りない気がするなぁ。
せっかく静的安全性にこだわっているのに、型無しのnullを使うのはこだわりが足りない気がするなぁ。
315デフォルトの名無しさん
2021/09/07(火) 15:00:30.72ID:gb4OeP+0 OptionがあるのにNullObjectいらなくないです?
316デフォルトの名無しさん
2021/09/07(火) 15:16:47.38ID:yn0D/zff317デフォルトの名無しさん
2021/09/07(火) 15:20:59.00ID:oZHnA/lF NullObjectは時代遅れ過ぎる
318312
2021/09/07(火) 15:36:48.61ID:O1QkM6d3■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国連大使「日本が中国に武力行使すると脅しをかけたのは初めて」 国連事務総長に書簡★5 [♪♪♪★]
- 高市首相告白「『なめられない服』を選ぶことに数時間を費やしました」「外交交渉でマウント取れる服、買わなくてはいかんかもなぁ」★4 [ぐれ★]
- 【🐼】パンダ、日本で会えなくなる? 中国との関係悪化で不安の声 ★2 [ぐれ★]
- 【芸能】44歳・池脇千鶴、激変ぶりにネット衝撃 「まるで別人…」「変化が凄い!!」の声 [冬月記者★]
- 竹中平蔵氏、万博は大成功だったと持論 批判していた人々にチクリ「反省の弁の一つも聞きたい」 [バイト歴50年★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★15 [BFU★]
