X



Rust part9
■ このスレッドは過去ログ倉庫に格納されています
0568デフォルトの名無しさん
垢版 |
2021/01/11(月) 14:09:54.51ID:MiJ5pxpq
ファイル (またはネットワーク) から得られる所定の書式のレコードの繰り返しを
イテレータとして抽象化したいと考えました。
(ちなみにレコードの繰り返しの前にレコードの個数を含むヘッダもあります。)

しかし IO はエラーの可能性があります。
書式の仕様に違反する入力になっている可能性もあります。

イテレータが返す型を Option<Result<要素の型,エラーの型>> としてしまうと
エラーの時点で終端という扱いにならないので様々なメソッドと組み合わせ難いですし、
Result を挟まないとエラーの内容を返せないのでハンドリングしづらいです。

何か綺麗にやれるイディオムのようなものがあったりしませんか?
0569デフォルトの名無しさん
垢版 |
2021/01/11(月) 15:21:23.54ID:8i1ZTkbL
エラーの時点で終端にするかどうかは呼び出し側が決めることじゃない?
Option<Result<T, E>>もResult<Option<T>, E>もイディオムとしてよく使われてる
0570デフォルトの名無しさん
垢版 |
2021/01/11(月) 15:47:03.74ID:MiJ5pxpq
>>569
出来るか出来ないかで言えば出来るし好きにすれば良い話ではあるんですが、
標準で良いされている様々なメソッド (たとえば map のような基本的なメソッドさえ!)
と「組み合わせ難い」ということが綺麗じゃないなぁという気持ちなんですが、
そこらへんの不格好さは許容するしかない雰囲気ということでしょうか?

(通常の終端に到達するのとは別に) 中断を表現する方法があって
中断の理由を伝播するのに便利な語彙を詰め込んだクレートがあったりすると
助かるんですが。
0573デフォルトの名無しさん
垢版 |
2021/01/11(月) 20:34:05.33ID:D6pgjuRM
イテレータとして抽象化したいってどういう意味なの
Iteratorをimplするってことなのかしら
0574デフォルトの名無しさん
垢版 |
2021/01/11(月) 23:06:51.09ID:MiJ5pxpq
>>573
ここでいう「イテレータとして」というのは std::iter::Iterator に限るわけではなく、
繰り返しを表現する何らかの型定義と思ってください。
適当なクレートがあるならそれでいいですし、考え方だけでもいいです。

欲しい機能をあらためてまとめると

・ 繰り返しに (終端に到達する以外の) 中断の方法が用意されている
・ 中断したときに中断の理由 (エラー型の値) を伝える方法がある

なのですが、
std::iter::Iterator だと next が返す Option<Result<T, E>> でエラーのときに
「中断」しようとすると for 文の中で break する書き方くらいしか思いつかず、
自分で便利なものを作ろうにもどう作れば便利になるのかも
想像がつかないのです。
0577デフォルトの名無しさん
垢版 |
2021/01/12(火) 08:20:11.60ID:tB/XA0DN
俺もtake_whileを思い浮かべたけど関数を作るわけじゃないんでしょ
ゴールがいまいちみえないからイメージでいいのでコードで用件を示してほしい
0578デフォルトの名無しさん
垢版 |
2021/01/12(火) 11:44:28.63ID:d2vxqIR1
単にエラー返して中断したいだけならResultにcollectしたりtry_for_eachで消費すればいいよ
イテレータアダプターとしてエラーも含めて列挙しつつ次につなげたいなら>>575が書いてるscanやtake_while系
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=113dcf689b4d941c89e714ebb1414958
0579デフォルトの名無しさん
垢版 |
2021/01/12(火) 20:39:12.01ID:jo+wjg9+
AsRefトレイト使ってenumから&str返すのっておかしい?
Display実装で文字返してたらアロケートされるからAsRef使おうと思ってるんだけど
0582デフォルトの名無しさん
垢版 |
2021/01/12(火) 22:42:54.02ID:jo+wjg9+
AsPath が AsRef<Path> になった過去もあるから汎用性持たしてas_str実装するよりAsRefで実装する方がいいといいと思うけど他の人はどう思う?
0585デフォルトの名無しさん
垢版 |
2021/01/13(水) 09:22:05.24ID:C+q6Ee0+
>>580
学習難度はまず低級言語と高級言語両方の利点欠点を理解しないと良さが理解出来ないからねえ…
設計思想からして中上級者向けだから仕方ないかも
0586デフォルトの名無しさん
垢版 |
2021/01/13(水) 10:55:46.25ID:vprvOgCy
単に学習難易度が高いだけでなく、学習が済んだ後もこの言語はめんどくさいが、
C++よりもむしろ。
0587デフォルトの名無しさん
垢版 |
2021/01/13(水) 12:45:22.11ID:jEgTYBOk
>>582
AsRefはIntoOwnedと対になっていて str<->String Path<->PathBuf みたいな ref/owned 関係にあるもの同士の変換に使うものだと思う
enum -> &str はそういう関係にはないので微妙に思う
0590デフォルトの名無しさん
垢版 |
2021/01/13(水) 21:18:34.66ID:LRQMEOBI
Rustのめんどくさいところはダントツでクレート関係だよな
標準で入ってないかつ、細かすぎるからコンパイル糞長いし、APIの仕様が統一されてないからドキュメント見ないと話にならんとこ
しかもクレートによっちゃライフタイム絡ませてきてめちゃくちゃになるし
C++はとにかく言語仕様のいらない豊富さが嫌気さす
0594デフォルトの名無しさん
垢版 |
2021/01/14(木) 01:57:39.37ID:vEkmKZjk
クレートいいと思うけどな
標準ライブラリに入れると破壊的変更できなくなるけどクレートなら古いバージョン使うことも出来るから
気兼ねなくライブラリを進化させることが出来る
0595デフォルトの名無しさん
垢版 |
2021/01/14(木) 08:51:13.78ID:2AI/maqn
pure-Rustのクレートなら今のところ確実にコンパイルは通るしな。
C++だとGitHubから拾ってきたライブラリが手元でコンパイル通るかどうか半々って感じで厳しい。
マイナーなディストリビューションのせいではあるけど、全部Ubuntuに統一というわけにもいかんしなぁ。
0596デフォルトの名無しさん
垢版 |
2021/01/15(金) 20:23:33.58ID:nexKBT6E
struct A;
struct A();
これとこれが定義できる理由ってなんかある?

struct A {};
だけで済むし、記述バラバラになるから統一したいんだけど
0597デフォルトの名無しさん
垢版 |
2021/01/16(土) 00:28:37.68ID:eM3BiVBC
Rustが一番めんどくさいのはメモリ管理だな。
というよりメモリ管理の事ばかり気にしてプログラムしなくてはならない。
plain CやC++ではそこまで気にしなくて良い。
0598デフォルトの名無しさん
垢版 |
2021/01/16(土) 01:28:58.93ID:/D0gGWRu
?????????
0601デフォルトの名無しさん
垢版 |
2021/01/21(木) 02:51:30.26ID:ooF1treM
Rust で書いたツールにドキュメントを付けようとしています。
ライブラリのドキュメントではなくツールとしての使い方の詳細で、
readme に書くには大きすぎるような文章です。

cargo.toml では package.documentation でドキュメントの場所を URL で
示すことは出来るようですが、パッケージ内にドキュメントを一緒に入れておいて
cargo install で適当なところにインストールするようなことは出来ないのでしょうか?

あるいは cargo の直接の管理下には入れられないにしても
なんらかの習慣があったりしますか?
0603デフォルトの名無しさん
垢版 |
2021/01/21(木) 14:31:58.28ID:3s9o6nSW
manみたいにドキュメントインストールする方法は知らないな。
ローカルにインストールしなくてもリポジトリのwikiあたりに使い方書いておいてそれ見てねでいいんじゃないかとおもうけど。
0604デフォルトの名無しさん
垢版 |
2021/01/21(木) 21:40:35.33ID:e05IQa93
ビルドスクリプト使ってenv::var("OUT_DIR”)で取得できるパスにファイル出力してるのが多いみたい
0605601
垢版 |
2021/01/21(木) 22:18:23.22ID:ooF1treM
なるほど。 そういうやり方もあるんですね。
でもドキュメントを各環境で適切な場所に
インストールするのは結局は手作業ということになりそうですね。

そういうことなら無理に自動化するのは諦めて
必要ならこのディレクトリで mdbook コマンドを実行してねみたいな感じにした方がかえって楽かな……
0607デフォルトの名無しさん
垢版 |
2021/01/24(日) 00:35:05.68ID:sFJWsyrt
fn num() -> usize {
10.pow(9)
}
この定数はなぜ推論でusizeにならないんですか?
0608デフォルトの名無しさん
垢版 |
2021/01/24(日) 19:33:54.83ID:tQo0lqIt
もういい加減にしてクレート
0609デフォルトの名無しさん
垢版 |
2021/02/03(水) 05:50:55.51ID:0f68sTlM
なんでいちいちゴミをワサワサDLしなきゃならねーんだよゴミ言語
0613デフォルトの名無しさん
垢版 |
2021/02/04(木) 20:19:37.24ID:qhstqCrC
その2つは別のもの
どっちも存在する

&strはstring sliceのborrow
&StringはStringのborrow
0614デフォルトの名無しさん
垢版 |
2021/02/04(木) 20:39:25.16ID:kqT/5NjJ
>>613
同一だと思ってたけど違うの??


&strを要求する関数とかメソッドに&String渡しても動くもんだからてっきり
0615デフォルトの名無しさん
垢版 |
2021/02/04(木) 20:54:06.40ID:/mf7s98M
それはDerefの効能
0616デフォルトの名無しさん
垢版 |
2021/02/04(木) 21:06:19.09ID:/mf7s98M
&strはStringの一部か全部へ参照 rust的にはスライスへの参照
&string[1..3] こういうこと

引数を&StringにするのStringの参照しか渡せないが、&strにすればStringの一部や””で囲った&strも渡せる
0617デフォルトの名無しさん
垢版 |
2021/02/05(金) 01:36:04.17ID:cqRcw5h6
>>614
引数として&strをとるメソッドや関数に&Stringは渡せないんじゃなかったっけ
self の場合の話?
0620デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:35:15.48ID:cqRcw5h6
>>618
二つ目の例だけ記憶してて勘違いしてたみたい。ありがとう

>>619
rustは暗黙変換かなり少ないからマシな方だと思う
メソッドのselfの暗黙変換はないとつらいかと
0625621
垢版 |
2021/02/07(日) 10:23:42.94ID:ik9tpY93
>>623
うん、それが最適でしたね

もともとTと&T -> boolからOption<T>を構築してたコードがあってSome(t).filter(|t| !t.is_hoge())ってしてたんだけど
それをResultに変えようとしたらif式で数行増えちゃって
ちょうど対応するようなのって無いのかな?って思って質問した次第でした
0627デフォルトの名無しさん
垢版 |
2021/02/08(月) 19:14:38.32ID:g+sV++N4
Rustの良さが実感できるのは長大なコードをチーム開発するときなのかな

小さいプロジェクトならRustは
・生ポインタ使わない
・できる限りSTLを使う
・const、moveをデフォルトで使う
ことにしたC++に敵わないような
C++の方が柔軟だしず〜っと短く書けるし
0628デフォルトの名無しさん
垢版 |
2021/02/08(月) 19:48:24.23ID:g+sV++N4
あ、標準の機能とかイディオムを巧みに使えばC++並みに短く書けるよ、というのがあったら教えてください
0629デフォルトの名無しさん
垢版 |
2021/02/08(月) 20:52:33.63ID:tj1CufyM
どちらかというとC++の方が長くない?
ヘッダとソースの重複とかイテレータが冗長とかshared_ptrが長いとか。
あと小さいプロジェクトだとビルド環境構築の手間が
相対的に大きくなるからC++はつらいな。
0631デフォルトの名無しさん
垢版 |
2021/02/08(月) 21:36:53.51ID:UsSsiWeS
RustスレなのでRustの味方をすれば良いと思うが、>>629はあまりにも言いがかりだろう

> ヘッダとソースの重複
重複するコードを書かなければならないことなどない

> イテレータが冗長
今どきautoせずにイテレータを書くことはない

> shared_ptrが長いとか
これは確かに
0632デフォルトの名無しさん
垢版 |
2021/02/08(月) 22:14:40.49ID:tj1CufyM
>>631
テンプレートでなければ関数プロトタイプと実装で同じこと書くと思うんだけど最近は違うんだっけ?
あとイテレータはbegin/endのこと。これも書かなくて良くなったりしてる?
0633デフォルトの名無しさん
垢版 |
2021/02/08(月) 22:48:07.53ID:UsSsiWeS
>>632
特殊化が必要なら当然特殊化するし、プロトタイプしか与えられてない関数は当然中身を他の場所で実装しなければならない
が、いずれもヘッダその他で書いてあるのと同じことを繰り返し書くという意味ではない
「引数と返り値をプロトタイプと実装で二度書くじゃないか」と主張してるのか?
だとしたら、「Rustのtraitとimplは同じことの繰り返しだ」と同レベルのデタラメだ


> あとイテレータはbegin/endのこと
範囲for文はあるので、コンテナを走査する時にはbegin()もend()も書く必要はない
が、begin()やend()の指すイテレータが必要なら当然書く必要がある
しかしこれより簡潔な表現方法があるか?
0634デフォルトの名無しさん
垢版 |
2021/02/08(月) 22:59:07.96ID:tj1CufyM
>>633
いや、Rustのtraitとimplも同じことの繰り返しだと思うが。
もちろんそれぞれに意味があるのは分かるが、今話題になってるのは長いかどうかなので、単に長いのでは?ということ。
begin/endは言われてみれば確かにそんなに長くもないな。
0635デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:04:02.74ID:tj1CufyM
そういえばRustだとderiveで導出できるようなのを
手で書かないといけないのも面倒だと思ってたけど
それも最近のC++だと便利になってるのかな?
0636デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:09:22.70ID:UsSsiWeS
>>634
〜〜〜〜〜ッッ!!?!!????
型を示すだけぞ???
どういう理屈で「どちらかというとC++の方が長い」???
「プロトタイプ」なる仕様が冗長だと思ってるということか?
だとしてもどこがどうRustより長い?
traitとimplが同じことの繰り返しに見えるなら尚更
0640デフォルトの名無しさん
垢版 |
2021/02/09(火) 00:49:55.66ID:M+MJQwFs
>>627 がどういうところでrustを冗長に感じたのかが分からないと身のある議論にならないのではないか
0641デフォルトの名無しさん
垢版 |
2021/02/09(火) 01:06:11.87ID:iu64Jkj8
let v2 = v.iter().take_while(pred).collect::<Vec<_>>();

auto iter_end = std::find_if_not(v.cbegin(), v.cend(), pred);
auto v2 = std::vector<Hoge>(v.cbegin(), iter_end);
0647デフォルトの名無しさん
垢版 |
2021/02/09(火) 17:12:10.08ID:hLMZgkSi
>>646
無難なのは tokio だが、言語としては非同期ランタイムを固定しないという明確な指針がある以上は
使い分けしなさいということになると思う。
0648デフォルトの名無しさん
垢版 |
2021/02/09(火) 18:32:36.30ID:nK2/UuNc
traitとimplが同じことの繰り返しは流石にキテレツ過ぎてワロタ
こういう基本的な言語仕様も分かってない人にとってRust使うメリットってあるのかな

「どっちが短く書けるか」については、流石にC++じゃないかな
良くも悪くも自由だし、短さだけを追求したクソコードも作れる

一方でRustも一応エルゴノミクスを掲げてはいるし、冗長さは感じない
C++が短くでき過ぎる、って言い方が正しいとおも
0649デフォルトの名無しさん
垢版 |
2021/02/09(火) 19:12:15.97ID:tpC3waGh
>>642
林檎やfacebookの参入、ゲームやスマホでの導入例が出てくればこれはかなりの地位を占めるな
0650デフォルトの名無しさん
垢版 |
2021/02/09(火) 20:13:22.59ID:G8as3nFu
コードを短くできるなんてどうでもいいことに囚われて半端になってる印象。
0656デフォルトの名無しさん
垢版 |
2021/02/10(水) 06:12:58.16ID:IJdnUleO
いやーRust難しくないっすか…
3回くらい入門したけどrustlingsのiterあたりでつらくなってくる
アホは他の優しい最新言語やったほうがいいんですかねぇ
0657デフォルトの名無しさん
垢版 |
2021/02/10(水) 08:20:43.62ID:Y3LDlcI4
でもRustのコンパイル基盤のLLVMはいつまで経ってもC++製のまんまだよね
書き直さなきゃC++の牙城は壊せんで
0661デフォルトの名無しさん
垢版 |
2021/02/10(水) 23:59:35.72ID:ToMnnTm0
>>658
Appleは重要なパトロンではあるけど関心はApple以外誰も興味無い
キメラ言語のObjective-Cを守る一点だけだろ
0662デフォルトの名無しさん
垢版 |
2021/02/11(木) 01:31:10.60ID:9tQEVdS2
>>657
というかC++をちゃんと使いこなしている人は、Rustが便利だとは思えない人が多い
のでRust化する動機が無い。
0663デフォルトの名無しさん
垢版 |
2021/02/11(木) 02:06:38.13ID:Bko8L/Zl
>>662
>>627てこと?

> 小さいプロジェクトならRustは
> ・生ポインタ使わない
> ・できる限りSTLを使う
> ・const、moveをデフォルトで使う
> ことにしたC++に敵わないような
> C++の方が柔軟だしず〜っと短く書けるし
0664デフォルトの名無しさん
垢版 |
2021/02/11(木) 02:10:08.49ID:9tQEVdS2
>>663
むしろ、STLがクソすぎるのがC++が嫌われる原因。
C++は、STLを使わずに独自templateライブラリを使うのが便利。
0665デフォルトの名無しさん
垢版 |
2021/02/11(木) 02:23:45.58ID:Bko8L/Zl
>>664
「使いこなす」がレベチ過ぎてワロシ
コンテナとアルゴに関しては俺もSTL使う方が良いと思ってたわ
vector<bool>とか、難のある仕様があるのは理解してたがそういうのに個別に対処すれば十分だろうと

リーナスとかもSTLが大ッ嫌いだという記事をよく見るが、具体的にどこを毛嫌いしてるのか俺は理解していない
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況