Rust part8

■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

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

前スレ
Rust Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
365デフォルトの名無しさん
垢版 |
2020/04/03(金) 14:52:15.88ID:11HfTHW1
test bench_test ... bench: 111,111 ns/iter (+/- 11,111)
ベンチマークの +/- ってどういう意味?
366デフォルトの名無しさん
垢版 |
2020/04/03(金) 15:47:04.36ID:uTu5qR57
>>363
is_none()は==NULLや==nilと同じ書き忘れのリスクを伴う"プログラマの注意力"を消耗するだけのゴミだろ
2020/04/03(金) 17:29:34.32ID:q/cvlU88
>>365
サンプルのmax - min
https://github.com/rust-lang/rust/blob/master/src/libtest/bench.rs#L57

min, maxは上下5%の外れ値処理をした後のものみたい
368デフォルトの名無しさん
垢版 |
2020/04/03(金) 19:54:55.15ID:CGYa3yhA
if letやmatchにしないとSomeだったときの処理書けないしょ
2020/04/03(金) 23:35:51.11ID:gSdeIOHU
最近勉強し始めたんだけどムズすぎ😭
2020/04/04(土) 00:07:28.35ID:cnL2FB3T
rust実用化に成功したプロジェクトって何があるの?お前らの会社では成功してるの?
2020/04/04(土) 00:29:58.91ID:hnhE9+15
実用化って何
2020/04/04(土) 01:42:27.61ID:R4+HYdkE
rustで作ったメカの中でセックスしましたみたいな
373デフォルトの名無しさん
垢版 |
2020/04/04(土) 04:16:29.04ID:aJleCvsu
use chrono::{Utc, TimeZone};
assert_eq!(Utc.ymd(2015, 5, 15).to_string(), "2015-05-15UTC");
なんでこれって静的メソッドじゃないのにself省略で使えるんですか?
https://docs.rs/chrono/0.4.11/chrono/offset/trait.TimeZone.html#method.ymd
374デフォルトの名無しさん
垢版 |
2020/04/04(土) 08:43:05.69ID:ziV4A0+Z
Utcはフィールドを持たないstructだから
イメージ的にはUtc{}.ymdとしているかんじ
2020/04/04(土) 11:37:00.81ID:oHbtMe0Y
Unit-like structsってやつだね
376デフォルトの名無しさん
垢版 |
2020/04/04(土) 16:49:30.52ID:aJleCvsu
公開されていないLoopStateっていうenum使いたいんですけどコンパイラーオプションとか属性とかで使う方法ありませんか?
https://doc.rust-lang.org/src/core/iter/mod.rs.html#371-422
2020/04/04(土) 17:26:12.04ID:9lNQDQEm
pub が付いてないものをそんなに簡単に使えたらモジュールの意味がないやろ……。
2020/04/04(土) 17:26:43.72ID:9lNQDQEm
そのモジュールをコピペして新しいモジュールを作れば自由に出来るんとちゃう?
2020/04/04(土) 20:00:52.19ID:BQ+xJjAs
Docs.rsのメソッドの引数の見方がわからん
具体的には
https://docs.rs/image/0.23.2/image/struct.Frames.html
pub fn new(iterator: Box<dyn Iterator<Item = ImageResult<Frame>> + 'a>) -> Self
2020/04/04(土) 20:42:49.37ID:oHbtMe0Y
iteratorを受け取ってSelfを返す。
iteratorは各要素がImageResult<Frame>のもの

Box<dyn …>してるのはコンパイル時にTrait ObjecのSizeが決まるようにするため
(Generics使えば不要)

‘aはiteratorのlifetimeをSelfのlifetimeにするため
2020/04/04(土) 22:54:06.10ID:BQ+xJjAs
>>380
解説ありがとう
上二行は理解できたんだが他がイマイチ・・・
2020/04/05(日) 10:19:35.11ID:LNp8foc9
>>381
dyn は C++ で言う抽象クラスみたいなもんだよ。
トレイトオブジェクトというのは実際にはそのトレイトを実装している様々な型の可能性があって、
それら全てを格納可能な大きさはわからない。
Box は C/C++ でいうポインタみたいな用途で使われる。
大きさがわからなくてもオブジェクトの場所を指すことは出来る。

「そのトレイトを実装している型ならなんでも」と「そのトレイトを実装している型のいずれか」というのは違う意味で、
ジェネリクスは後者。
言い換えると、実行時にディスパッチされる多相とコンパイル時にディスパッチされる多相ってこと。
コンパイル時に型がわかるのなら大きさもコンパイル時にわかる。
大きさがわかるなら Box を経由しなくていい。

ライフタイムの 'a は Frames の型引数の 'a と同じだから、
new の返り値 (Self) の寿命は iterator の寿命と同じになる。
383デフォルトの名無しさん
垢版 |
2020/04/05(日) 11:42:45.53ID:/6aVgV0B
Boxと&dynの違いって参照元がヒープかスタックかの違い?
2020/04/05(日) 14:13:55.26ID:8bGOOvBY
>>383
そう
2020/04/05(日) 14:35:00.95ID:8bGOOvBY
>>381
大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない

Iterator Traitを実装してる型を引数として受け取りたいからといって
`pub fn new(iterator: Iterator<…>) -> Self` と書くと
Iterator Traitのサイズがコンパイル時にはわからないのでコンパイルエラーになる
`let foo: str;`でエラーになるのと同じ

Box<dyn Trait>か&dyn Traitの形にすれば
Iterator Traitへの参照(=Trait Objectというfatポインタ)になって
受け渡しするサイズが固定されるのでエラーにならない

ジェネリクスを使って
`pub fn new<T: Iterator<…>>(iterator: T) -> Self` と書いた場合は
実際の呼び出しに使われているTの型ごとにコンパイラがバイナリを生成するので
コンパイル時にTのサイズが決まってる (impl Trait使った場合も同じ)

>>382も書いてるように前者は動的ディスパッチ、後者は静的ディスパッチなので
異なる型が混在するコレクションを使いたい時やバイナリサイズを小さくしたい時以外は
ジェネリクスを選ぶほうが一般的
2020/04/05(日) 17:53:06.31ID:fOt2g8TG
あーなんとなくわかってっきた
ジェネリクスと同じことがトレイトオブジェクトでも実現できて、その書き方がBox<dyn...>ということか
2020/04/05(日) 19:06:03.32ID:LNp8foc9
同じことって言っちゃうと語弊がある気がするなぁ。
388デフォルトの名無しさん
垢版 |
2020/04/05(日) 21:52:05.83ID:/6aVgV0B
そもそもRustはかなり型のサイズに厳しいけどなんで?
コンパイラの最適化のため?
2020/04/05(日) 22:38:29.83ID:8bGOOvBY
>>388
他言語なら暗黙的に参照として扱われるようなものも
明示的に&を付けたりBox化することを求めるから厳しく感じるんだと思う

明示的に求めるのはowned/shared/mutableの3つを
一貫性を持って区別して書くようにっていう設計選択じゃないかな

>大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない
↑これ他言語でも常識かもしれないけど自分はRustやるまで意識したことなかったよ
2020/04/05(日) 23:09:09.40ID:/qXmUwFk
> pub fn new(iterator: Box<dyn Iterator<Item = ImageResult<Frame>> + 'a>) -> Self
入力にimpl Traitってまだ無理なんだっけ?

>>386
同じではない。
ジェネリックスはパラメトリック多相の事だから静的ディスパッチになるけどtrait objectは動的ディスパッチそのもの。

>>388
そう。
リージョンでメモリ管理するときリージョンのサイズが事前に決まるなら
リージョンはヒープじゃなくてスタックに確保できるからrustは型システムが
サイズが事前に決まる事を強制してる。
rustでは
2020/04/05(日) 23:12:44.10ID:/qXmUwFk
途中で送ってしもた。

rustでは当たり前に見えるけどこんな事してるのrustくらいでヒープが必要ならクロージャさえも自分でbox化する必要がある。
2020/04/05(日) 23:13:46.13ID:dvIeqTXE
スタック上に長さ不定のデータが作れるとバグの温床になる。
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
393デフォルトの名無しさん
垢版 |
2020/04/06(月) 00:16:34.72ID:WU94L+3C
配列サイズが決められてないかつ、関数内で配列生成するけど返り値はサイズ固定のスライス記法の書き方するようにする方法ってない?
つまりはVecのアロケートが嫌な場合
fn name(v: Vec<A>) -> Vec<A> {
v.iter().map(***).collect
}

これだとスタック確保できるけど無駄なデータ入ってるし、動的なサイズの配列を返せない
fn name(v: Vec<A>) -> [i32; 10] {
let mut arr = [0; 10];
for (i, x) in v { arr[i] = x}
arr
}

こういうスライスのスタック版みたいな感じのことがしたい
fn name(v: Vec<A>) -> [A] {
let mut arr = [0; v.len()];
for (i, x) in v { arr[i] = x}
arr
}
2020/04/06(月) 00:54:32.32ID:jrbG9hxT
>>390
impl Traitは引数にも使えるよ

>>393
[A]だとサイズがコンパイル時に決まらないから&[A]か&mut [A]を返すのはできる
ただ入力がVecで長さが不定なので
出力の参照元にその長さの配列を使うのは無理じゃないかな
2020/04/06(月) 00:59:52.27ID:jrbG9hxT
あと関数内部で配列生成したら
そのlifetimeが関数内に閉じるので参照も返せないね
2020/04/06(月) 01:07:26.57ID:jrbG9hxT
やるとしたら
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
2020/04/06(月) 01:16:22.32ID:FD55gb+K
C言語でいうところの if ( (c=foo()) == bar) { ...(cを使う処理)
みたいなことやりたいんですがどうすればいいですか?
fooが結構重くて2回呼び出したくないのですが、
let c = foo();
if c == bar {...
とやるしかない?
398デフォルトの名無しさん
垢版 |
2020/04/06(月) 01:49:32.44ID:JJIxYQHA
matchとifガード使えば似たようなことは出来る
399デフォルトの名無しさん
垢版 |
2020/04/06(月) 02:48:45.03ID:WU94L+3C
>>396
何かしらのライブラリでなんかないかな?
static使うぐらいなら素直にVec使うわ...
2020/04/06(月) 03:03:32.80ID:jrbG9hxT
>>397
@ bindingってのを使う

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826
2020/04/06(月) 04:04:37.66ID:FD55gb+K
>>398
match foo() {
c if c == bar => { .. },
_ => (),
}
こういう感じでしょうか。この場合だと記載量としてはかなり微妙ですが何かに使えそうなので覚えときます。
ありがとうございます。

>>399
今回の場合はfoo()がboolじゃないのと、barが変数なのでシャドーイングされてうまくいかないようです・・・。
if let foo @ bar = foo() { ...
みたいなことやろうとしましたがダメでした。
https://play.rust-lang.org/?version=nightly&;mode=debug&edition=2018&gist=d580f91c98f26cf52a23791489914ec3
2020/04/06(月) 22:14:10.89ID:/YOLus+e
>>390
うーん難しいな

プログラムの動作としては同じになるんじゃないのか
2020/04/06(月) 22:57:49.62ID:2RUK7fME
Vecとかのコンテナ系の使い方は大分変わるよ
例えばイベント駆動の何かを作るときには考えた方が良いかと思う
struct XEventSource {
listeners : Vec<Box<dyn Handler>>,
...
}
trait Handler { fn handle(ev: &XEvent) -> () }

impl XEventSource {
fn addLisnter(&mut self, listener : Box<dyn Handler>) -> () {
 self.listeners.push(listener);
}
fn emit(&self) -> () {
 XEvent ev = ...;
 for listener in listeners.iter() {
  listener.handle(&ev);
 }
}
}
みたいに作ると、利用者が好きに作った構造体でもHandlerをimplすればlistenersに足せる
ジェネリクスだとイベントリスナの実際の型1つしかaddできないので不便
2020/04/06(月) 23:45:59.83ID:TaQVQ6iW
>>402
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)

トレイトを実装している型を実際には一種類しか使わないのだったら、
実行時間を除けば見かけ上の動作で違いはないかもしれんな。
でも基本的にはやりたいことを出来る範囲で制約は厳しい方がいい。
間違いの検出される可能性が高まるから。

制約をどのように表現するかというのはプログラミング言語の設計においては重要なトピックで、
構造化プログラミングが提唱されたのも goto だと制御をどこへ移動するのか制約を付けられないってのがある。
さらにそれを発展させた形として型で制約を付けようってのが色々と考えられてきたし、
Rust では更にオブジェクトの寿命に制約を付けようという考えが実現された。

その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
405デフォルトの名無しさん
垢版 |
2020/04/07(火) 08:14:23.99ID:FPXvnSDp
APIサーバーでJSON受け取るときに値の型が違ったりオーバーフローするときってどうしてる?
serde_json::from_str で構造体の属性でエラーメッセージとかつけれたらいいのにな
406デフォルトの名無しさん
垢版 |
2020/04/07(火) 15:06:01.62ID:+YUDNjw9
from_strの結果そのまま使ってるけどダメなの
シンタックスエラーとか含めると大変じゃない
407デフォルトの名無しさん
垢版 |
2020/04/07(火) 15:54:15.51ID:FPXvnSDp
海外向けサーバーだったらいいけど日本向けサーバーの場合は?
serde_jsonのエラーメッセージcustomizableじゃないから辛い
408デフォルトの名無しさん
垢版 |
2020/04/07(火) 16:02:31.28ID:+YUDNjw9
serde_json::Error を見ると行と列と大雑把な原因はとれるみたい
細かくやるなら置換するしかなさそうだね
409デフォルトの名無しさん
垢版 |
2020/04/08(水) 10:01:13.64ID:qyTF9Er6
reached the configured maximum number of stack frames
でスタックフレームの制限にかかるんだけどオプションとかで変えれる?
410デフォルトの名無しさん
垢版 |
2020/04/11(土) 23:13:20.24ID:EhWtF4tX
impl<'_, T> Drop for std::collections::vec_deque::Drain<'_, T>
こういう風にちゃんとパス書かれたのもあれば、デフォルトインポートされてないのに省略されてる型あるけどどうなってるの?
https://doc.rust-lang.org/std/ops/trait.Drop.html
2020/04/11(土) 23:59:49.19ID:Ni1vKiQd
フルパス書かなくてもいいように
mod.rsに指定されてるものとされてないもの
2020/04/12(日) 23:38:47.63ID:dFThPQBr
クロージャの再帰呼び出しってできないんですか?
2020/04/13(月) 09:02:25.60ID:45YCco/F
それが必要な理由は?ここはお前の便利帳じゃねーんだから
有益な使い方が有れば紹介してから聞け
2020/04/13(月) 10:22:01.83ID:6kXZCaEk
>>412
Yコンビネータ

Rust で適切に型がつけられるかどうか知らんけど
2020/04/13(月) 11:59:07.30ID:WFzH9Pd8
>>413
データ入ったVecと各種定数とメモ化用のmutなHashMap使ったDFSするときとか、引数がむっちゃ長くなるんです

>>414
全然わからんのであきらめます・・・
416デフォルトの名無しさん
垢版 |
2020/04/14(火) 07:17:51.31ID:WrIQImmd
Copyでの関数呼び出しとポインタ作成ってコスト的にはプリミティブのどの型からが処理重い?
ここらへんCSの知識ないからわかんない
2020/04/15(水) 02:35:11.54ID:rawye3jg
Rust仕事で使ってる人〜
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
2020/04/15(水) 02:44:45.60ID:hMxv+37E
あらら(´・ω・`)
2020/04/15(水) 05:30:29.65ID:SZSUFLJC
組み込みで試験的に導入したけどムズイ
まあ慣れの問題もあるのだろうけど
2020/04/15(水) 21:10:37.56ID:mcKFmUGe
組み込みでrustに似た言語。ATS2が。
421デフォルトの名無しさん
垢版 |
2020/04/15(水) 21:11:58.85ID:60TKpqE+
Nimは?
2020/04/15(水) 21:27:25.14ID:8I3eMZIA
ATS2ってRust以上にドキュメントが少なくてHaskell以上に難解なアレじゃないですかやだー!
2020/04/15(水) 23:28:51.38ID:hMxv+37E
やだー!
424デフォルトの名無しさん
垢版 |
2020/04/16(木) 09:03:49.64ID:YGIESbh5
Rust界隈で一番貢献度高いのってAlexとかになるかな?
2020/04/17(金) 14:41:30.42ID:SjHnVlOc
Microsoftに期待してるんだが今はそれどころじゃ無さそう
2020/04/18(土) 00:35:43.07ID:Dq0Xmd2Y
Alexは人の話聞けっていう
2020/04/18(土) 07:35:23.99ID:mN+EtaBg
これはいずこへ
https://doc.rust-lang.org/1.1.0/std/slice/struct.Permutations.html
2020/04/18(土) 15:23:13.66ID:8wM3wY+l
勉強がてらこちらの二分探索木を真似してみたのですが、コンパイルエラーが出てしまいます。
https://codereview.stackexchange.com/questions/133209/binary-tree-implementation-in-rust

playgroundで試してみた結果がこれです。
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=fc1fe0d2a4c39c6b28d017539419fa2a


どうやら古いRustならコンパイルが通るようなのですが、今のRustでコンパイルを通すにはどうすればよいのでしょうか?
429デフォルトの名無しさん
垢版 |
2020/04/18(土) 18:14:53.19ID:EW6Y9RQI
Alexが人の話聞かないってこと?
2020/04/19(日) 10:46:13.87ID:8Q+7ObaB
ダメ出しよろ https://ideone.com/fswv4P
2020/04/19(日) 12:14:31.72ID:lAlWodFD
非常に良いと思います。flagの意図を読み解くのが少し難しいくらいです。
432デフォルトの名無しさん
垢版 |
2020/04/20(月) 08:24:43.01ID:JR6Mr590
確かにflagが読みづらいからコメントは欲しいかな
個人的にはuse Exp::*;とExp::V => Exp::Valueにするのとテストケース増やしてmod testsにするかな
let exp = Value("MITSU").add(Value("MITSU")).add(Value("MITSU")).eql(Value("CORONA"));
let solver = Solver::new(exp);
// prints solved exp
solver.solve();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
2020/04/23(木) 19:29:00.20ID:WjWrG05V
トレイトって機能を追加するときどういう機能であるかの特徴を一見して分かりやすくするためだけのもの?
2020/04/23(木) 20:53:30.42ID:87GHMCpD
振る舞いや
2020/04/23(木) 22:36:03.84ID:5udoMUF9
>>433
とりあえずはJavaやC#のインターフェースっぽいものとして捉えておけばいいんじゃないのかな
やってるうちに違いも分かってくる思うので
2020/04/25(土) 02:58:36.79ID:FXjmUrQ8
これライフタイム記述を省略できないのなんで? https://git.io/JfL6t
2020/04/25(土) 21:29:12.23ID:2AkpFzKs
省略してコンパイラ通るけどstableは無理なん?
2020/04/26(日) 00:34:16.68ID:eoUYVhAX
関数内で同じ一連の処理を複数回実行するときマクロにまとめるのが一般的?それともクロージャ?
他にやりかたある?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=30449f979231232b68016cab5cd1fb1e
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=e5fc7f66785bb3794df19104d5c479ff
2020/04/26(日) 01:44:31.54ID:bgNhzTiH
>>438
関数

あとサンプルだからかもしれないけど
spilt_whitespace()とかでイテレータ使ったほうが読みやすい
2020/04/26(日) 01:49:37.98ID:bgNhzTiH
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=b03bef5cb6f98821032c5fb1cce618a1
2020/04/26(日) 08:01:37.17ID:eoUYVhAX
そのコードは実際に使うコードじゃなくてさあ、変数が何個もあったりすると関数切り出しは引数が地獄になるじゃん
2020/04/26(日) 11:00:13.57ID:bgNhzTiH
その例でマクロかクロージャの二択ならクロージャだけど
>>438のは外側の変数をキャプチャすることで複雑化してるから&tangoを渡すようにする
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=ec760be4190e2ad4ab21fbea3c84b0ed

そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
2020/04/26(日) 12:20:05.30ID:9haVb0dh
Rustの問題集みたいなのってあったりする?
2020/04/26(日) 12:50:17.90ID:9haVb0dh
この連休である程度かけるようになりたい
445デフォルトの名無しさん
垢版 |
2020/04/26(日) 14:52:26.46ID:WcQXqCZk
連休だけでRustかけると思うことが間違ってるよ
2020/04/26(日) 15:59:36.18ID:bgNhzTiH
公式のGithubにrustlingsっていう簡単な練習問題がある
The Bookを読んだ後に基本文法をおさらいしたい人向け
https://github.com/rust-lang/rustlings
2020/04/26(日) 16:01:54.22ID:9haVb0dh
>>446
うおおおおおおサンクス
2020/04/27(月) 05:09:42.36ID:4dCrlHPD
↓Vecだと動くのに配列にするとコンパイルできないの何で?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=6321129e5cc3853ef1421d706e19a136
2020/04/27(月) 06:06:02.00ID:9c9dxgXm
配列にinto_iterしてもmoveされずに参照が返るから
2020/04/27(月) 09:24:11.80ID:xj40wisa
rustいつのまにか蟹のイメージになってるけど、オライリーの影響?それとももっと前から何かあるのかな?
2020/04/27(月) 09:35:35.74ID:qLbh0tK5
よくしらんけどこれじゃね?
https://rustacean.net/
452デフォルトの名無しさん
垢版 |
2020/04/27(月) 12:48:32.95ID:vsE9eV5m
let mut heap = BinaryHeap::new();
heap.push(10);
heap.push(9);
heap.push(20);
for x in &heap {
println!("{:?}", x);
}

これでバイナリヒープすると
20
9
10
ってなるんだけどバグ?
2020/04/27(月) 12:51:07.20ID:On5R6UtW
>>448
配列のIntoIteratorは
&[T; N]と&mut [T; N]に対して実装されてるが[T; N]に対しては実装されてないのでmove不可

対してVecのIntoIteratorは
&Vec<T>と&mut Vec<T>だけでなくVec<T>に対しても実装されてるので
moveが必要なコンテキストならIntoIterator for Vec<T>が選択されmove可能
2020/04/27(月) 12:53:27.20ID:ucpPL8Eb
>>452
ドキュメントに書いてある通り、iterは適当な順序で出てくるので仕様。
https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html
2020/04/27(月) 13:16:59.92ID:On5R6UtW
>>448
配列でやりたい場合はFooにClone実装してfoo.clone()
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=8fdb065f764ac7a0be3a3de161bfa984
456デフォルトの名無しさん
垢版 |
2020/04/27(月) 14:12:45.55ID:ZRv/ULjO
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
457デフォルトの名無しさん
垢版 |
2020/04/27(月) 15:43:57.57ID:vsE9eV5m
>>454
thx 見逃してた
2020/04/27(月) 17:58:08.76ID:4dCrlHPD
配列のIntoIteratorにmoveが実装されてないの何で?
2020/04/27(月) 18:30:46.65ID:On5R6UtW
>>458
詳しいことはよくわからないけど実装が難しかったみたいよ
興味あればこのissue読んでみて
https://github.com/rust-lang/rust/issues/25725

nightly使えばmoveできる機能はあるみたい
https://play.rust-lang.org/?version=nightly&;mode=debug&edition=2018&gist=6a22ab054f5ec52ea942a1186710a516
2020/04/27(月) 22:17:40.40ID:e7WQ8CRR
>>457
型制約見ればええんやで。

`pub fn iter(&self) -> Iter<T>`は`impl<T> BinaryHeap<T>`。

`impl<T> BinaryHeap<T> where T: Ord,` に`pub fn into_sorted_vec(self) -> Vec<T>`てあるやろ。
rustのOrdは全順序や!
2020/04/28(火) 01:18:27.68ID:barKq4nx
この場合はifを使うのとmatchを使うのとどっちがおすすめ?

if nanika_shori().filter(hoshiimonokana).is_some() {
hoge();
mitsukatta();
} else {
fuga();
mitsukaranakatta();
}

match nanika_shori() {
Some(butsu) if hoshiimonokana(butsu) => {
hoge();
mitsukatta();
}
_ => {
fuga();
mitsukaranakatta();
}
}
2020/04/28(火) 01:37:40.02ID:aaB86vh6
>>461
後者は関数型言語風ってだけでしょ
関数型言語で is_some() にあたる関数は存在しなかったり、有るけど使うなって扱いだったりする
2020/04/28(火) 02:09:21.04ID:nfkWT3p7
テレワーク中なのか連休入ったせいなのか知らんけど猛者が全部回答してくれるから助かるわ
464デフォルトの名無しさん
垢版 |
2020/04/28(火) 07:51:49.83ID:SJTliuFD
>>461
前者
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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