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/
探検
Rust part8
■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
293デフォルトの名無しさん
2020/03/26(木) 15:33:44.04ID:5np4UAxw294デフォルトの名無しさん
2020/03/26(木) 17:17:35.74ID:mwwmClxG c++の代替というけど、rust理解するにはc++でメモリイメージ固めた方が学習速いんじゃねーの?
295デフォルトの名無しさん
2020/03/26(木) 18:48:36.88ID:Rq1Q9bYl296デフォルトの名無しさん
2020/03/26(木) 21:50:13.71ID:HC2i5ubn ML系列の記法に慣れるとrustがどうしてalgol系列の記法にしたのか納得できなくなる。どんだけカンマ打たせるねん。
少し頑張れば関数の型も推論できると思うんだけど人まかせにしてるのが好きじゃない。せめて、勝手に挿入できるような記法にしとくべきだったと思う
少し頑張れば関数の型も推論できると思うんだけど人まかせにしてるのが好きじゃない。せめて、勝手に挿入できるような記法にしとくべきだったと思う
297デフォルトの名無しさん
2020/03/27(金) 00:25:53.78ID:GUIIkCWN インスタンスでフィールドアクセスにカンマ使わない場合どんなのがいいの?
推論は関数で境界作りたかったんでしょ
推論は関数で境界作りたかったんでしょ
298デフォルトの名無しさん
2020/03/27(金) 00:33:57.86ID:GUIIkCWN299デフォルトの名無しさん
2020/03/27(金) 00:47:04.38ID:4wGUX1E+ 型推論の能力的には関数も全部できるけど、ドキュメント目的であえてしてないはず。
300デフォルトの名無しさん
2020/03/27(金) 01:16:32.86ID:xxRyEnpG TypeScriptは戻り値の型を省略できるけど、書かないと訳が分からなくなるので言語的には省略出来てもコーディングルールで強制してるわ
Cみたいに変数宣言含めて型を全部書くのも面倒だけど、行き過ぎた省略もメンテナンス性を損なうと思う
Cみたいに変数宣言含めて型を全部書くのも面倒だけど、行き過ぎた省略もメンテナンス性を損なうと思う
301デフォルトの名無しさん
2020/03/27(金) 03:32:10.02ID:xTSSnKrR >>296
どういうカンマの事?
どういうカンマの事?
302デフォルトの名無しさん
2020/03/27(金) 15:34:02.04ID:9RtDMjhb C/C++に疲れた人が使って幸せになれるのがRustだと思ってたけど
実態は全然違うってことか
実態は全然違うってことか
303デフォルトの名無しさん
2020/03/27(金) 17:00:38.31ID:pa89frlH C++17に疲れた人なら結構幸せになれるんじゃない。
C89に疲れた人だと厳しそうだが…。
C89に疲れた人だと厳しそうだが…。
304デフォルトの名無しさん
2020/03/27(金) 18:51:24.66ID:JRwFCn2R RustのコンパイラソースをCloneしてそれをベースに名前も違うプログラミング言語作るのってライセンス的にどうなの?
rustcの構文解析の部分を変えてからそのrustcも全部その言語に変換したいんだけど
rustcの構文解析の部分を変えてからそのrustcも全部その言語に変換したいんだけど
305デフォルトの名無しさん
2020/03/27(金) 18:57:46.96ID:VaiYZBCN306デフォルトの名無しさん
2020/03/27(金) 19:49:39.79ID:oRj/lH5B >>299 あえてやらないなら、せめてコンパイラが推論した結果を教えてくれよと思う
この処理のこの部分だけ一旦切り出して別の処理にしてみたい、とかやるときにすげー大変
Haskellでも型表記は省略できるけどしない方が良いねって作法がメジャーなのは知ってるけど、型推論でサポートしてくれるからrustよりストレス少ない
ちょいとクロージャを関数として外に出しとこう、とか、ここ切り分けて別パターン用意して比較してみよう、とかやるのが面倒くさい
あ、まずクロージャにして型エラーを起こして教えてもらう、とかやればできるんかな…
この処理のこの部分だけ一旦切り出して別の処理にしてみたい、とかやるときにすげー大変
Haskellでも型表記は省略できるけどしない方が良いねって作法がメジャーなのは知ってるけど、型推論でサポートしてくれるからrustよりストレス少ない
ちょいとクロージャを関数として外に出しとこう、とか、ここ切り分けて別パターン用意して比較してみよう、とかやるのが面倒くさい
あ、まずクロージャにして型エラーを起こして教えてもらう、とかやればできるんかな…
307デフォルトの名無しさん
2020/03/27(金) 19:59:43.89ID:Pf+eY36z >>306
型を自分で書くのが面倒なときは()とかi32とか適当な型で埋めておいて、エラーメッセージから正しい型を持ってくるというのはありだよ。
(逆に言えば正しいエラーメッセージを出せるということは、関数プロトタイプまでちゃんと型推論できているということでもある)
型を自分で書くのが面倒なときは()とかi32とか適当な型で埋めておいて、エラーメッセージから正しい型を持ってくるというのはありだよ。
(逆に言えば正しいエラーメッセージを出せるということは、関数プロトタイプまでちゃんと型推論できているということでもある)
308デフォルトの名無しさん
2020/03/27(金) 21:21:00.05ID:aLfv28Wa 関数の型を推論するのを捨ててるから
Deref coercionだったりFrom/Intoだったり中身を書くときに型を省略できるんじゃないの?
owned/shared/mutの違いに加えてlifetimeもあるから
それらも含めて推論することになると現実に使えるレベルになるのかどうか怪しい
少なくとも現時点で注力するようなポイントじゃないと思う
Deref coercionだったりFrom/Intoだったり中身を書くときに型を省略できるんじゃないの?
owned/shared/mutの違いに加えてlifetimeもあるから
それらも含めて推論することになると現実に使えるレベルになるのかどうか怪しい
少なくとも現時点で注力するようなポイントじゃないと思う
309デフォルトの名無しさん
2020/03/27(金) 22:30:46.16ID:TRjL1ru9310デフォルトの名無しさん
2020/03/28(土) 02:49:23.51ID:7+pamnWR311デフォルトの名無しさん
2020/03/28(土) 09:49:38.92ID:laMmnOq7 HACK言語の成り立ちを参考にしたら
答えが見えてくるかもしれないよ
答えが見えてくるかもしれないよ
312デフォルトの名無しさん
2020/03/28(土) 19:16:01.84ID:9p87l6KY WebKitとBlinkみたいな感じでしょ?へーきへーき
313デフォルトの名無しさん
2020/03/28(土) 20:00:00.22ID:KbJ2BCU2 githubのissueのタグで頭についてるE-easyとかT-compilerみたいな大文字のアルファベットってどういう意味があるの?
314デフォルトの名無しさん
2020/03/28(土) 21:27:53.53ID:+WXFsbEZ315デフォルトの名無しさん
2020/03/28(土) 21:34:01.64ID:+WXFsbEZ316デフォルトの名無しさん
2020/03/29(日) 13:50:06.97ID:c6UG4oSX この引数に&つけるのって
iter.map(|&i| i * 2)
これと同等?
for i in iter {
let i = &i;
}
iter.map(|&i| i * 2)
これと同等?
for i in iter {
let i = &i;
}
317デフォルトの名無しさん
2020/03/29(日) 15:02:02.33ID:sFvWmixp 巨大な学術掲示板群 アルファ・ラボ
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
318デフォルトの名無しさん
2020/03/29(日) 15:16:29.91ID:u3wksM39319デフォルトの名無しさん
2020/03/30(月) 03:34:27.53ID:QPHAwv8T320デフォルトの名無しさん
2020/03/30(月) 03:44:28.46ID:Oymj8mf6321デフォルトの名無しさん
2020/03/30(月) 03:57:10.09ID:Oymj8mf6 iter.map(|i| i * 2)
と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas
と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。
と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas
と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。
322デフォルトの名無しさん
2020/03/30(月) 04:01:22.73ID:/1SwYHDd >>318が書いてるの合ってると思うけど?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6d886f2d3b944871c18856f0e19da71c
iterがshared referenceをイテレートするから
パターンマッチで`&`を1枚剥がした型にして使ってる
for &i in iterと同じ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6d886f2d3b944871c18856f0e19da71c
iterがshared referenceをイテレートするから
パターンマッチで`&`を1枚剥がした型にして使ってる
for &i in iterと同じ
323デフォルトの名無しさん
2020/03/30(月) 04:40:37.32ID:Oymj8mf6324デフォルトの名無しさん
2020/03/30(月) 04:45:30.74ID:Oymj8mf6 誤: let x:&i32 = y;
正: let x:&i32 = &y;
正: let x:&i32 = &y;
325デフォルトの名無しさん
2020/03/30(月) 11:38:27.40ID:/1SwYHDd >>323
左辺に代入する時にパターンマッチ使ってDestructuringしてる
例えばyが&i32ならxはi32になる
let i = 1;
let &i = i;
これがコンパイル取らないのは
右辺がintegerで左辺がreferenceを要求しててマッチしないから
let i:i32 = 1;
let i = &i;
let &i = i;
let i:() = i;
↑こうやって試せば3行目の&iへの代入でiが&i32じゃなくi32になってるのが分かる
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1d23370e99b388e2205c43e863885315
左辺に代入する時にパターンマッチ使ってDestructuringしてる
例えばyが&i32ならxはi32になる
let i = 1;
let &i = i;
これがコンパイル取らないのは
右辺がintegerで左辺がreferenceを要求しててマッチしないから
let i:i32 = 1;
let i = &i;
let &i = i;
let i:() = i;
↑こうやって試せば3行目の&iへの代入でiが&i32じゃなくi32になってるのが分かる
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1d23370e99b388e2205c43e863885315
326デフォルトの名無しさん
2020/03/30(月) 14:27:14.40ID:Oymj8mf6327デフォルトの名無しさん
2020/03/30(月) 14:34:27.40ID:yinACqvq328デフォルトの名無しさん
2020/03/30(月) 15:23:14.22ID:/1SwYHDd 1.38からはstd::any::type_nameがstabilizeされてるので
エラーメッセージやnightly使わずに変数の型をprintして確認できるみたい
(consumeしないようにreferenceで渡すから少し分かりにくいかもだけど)
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
fn main() {
let i = 1;
let i = &i;
let &i = i;
println!("{}", type_of(&i));
}
type_name_of_valってのも追加されてるけど
こっちはまだstabilizeされてない
エラーメッセージやnightly使わずに変数の型をprintして確認できるみたい
(consumeしないようにreferenceで渡すから少し分かりにくいかもだけど)
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
fn main() {
let i = 1;
let i = &i;
let &i = i;
println!("{}", type_of(&i));
}
type_name_of_valってのも追加されてるけど
こっちはまだstabilizeされてない
329デフォルトの名無しさん
2020/03/30(月) 16:45:46.87ID:Oymj8mf6330デフォルトの名無しさん
2020/03/30(月) 18:21:13.55ID:/1SwYHDd >>329
聞く前に試せばわかるよね
聞く前に試せばわかるよね
331デフォルトの名無しさん
2020/03/30(月) 18:43:59.32ID:QPHAwv8T /1SwYHDd氏やるなぁ
こういう細かいことまで知ってる人のRust歴気になる
こういう細かいことまで知ってる人のRust歴気になる
332デフォルトの名無しさん
2020/03/31(火) 00:49:28.04ID:bdtzxXSI さっきオナラしようとしたらウンチが少し出てしまったんだけど
ばれてないからいいよね ごめんね
ばれてないからいいよね ごめんね
333デフォルトの名無しさん
2020/03/31(火) 03:36:52.65ID:Hb9bQaKd 在宅だったら放屁は自由
334デフォルトの名無しさん
2020/03/31(火) 13:51:38.31ID:Ow5tuxOJ う〜ん。 ちがうなぁ。
335デフォルトの名無しさん
2020/04/01(水) 05:04:17.87ID:2vQ3PjhV やりたいこと
Optionからの安全な値の取り出しを構文レベルで保証、およびNone時に数行の処理と戻り値を伴う正常の早期returnをしたい
if Some(v) = foo.get() {
安全に取り出せるがネストが嫌すぎる
} else {
位置が遠すぎる
}
let v = if Some(v) = foo.get() {
v 安全取り出しだが冗長すぎて嫌
} else {
}
let v = match foo.get() {
Some(v) => v 安全取り出しだが冗長すぎて嫌
None => { }
}
if foo.is_none() {
構文で保証されずプログラマの注意力次第で嫌すぎる
}
let v = foo.get().unwrap();
let v = foo.get().ok_or_else(||{
は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか?
})?;
Optionからの安全な値の取り出しを構文レベルで保証、およびNone時に数行の処理と戻り値を伴う正常の早期returnをしたい
if Some(v) = foo.get() {
安全に取り出せるがネストが嫌すぎる
} else {
位置が遠すぎる
}
let v = if Some(v) = foo.get() {
v 安全取り出しだが冗長すぎて嫌
} else {
}
let v = match foo.get() {
Some(v) => v 安全取り出しだが冗長すぎて嫌
None => { }
}
if foo.is_none() {
構文で保証されずプログラマの注意力次第で嫌すぎる
}
let v = foo.get().unwrap();
let v = foo.get().ok_or_else(||{
は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか?
})?;
336デフォルトの名無しさん
2020/04/01(水) 08:10:52.28ID:3tt/1DhK let v = foo?;
337デフォルトの名無しさん
2020/04/01(水) 08:19:02.46ID:2vQ3PjhV は?
338デフォルトの名無しさん
2020/04/01(水) 09:19:54.63ID:yrAQuZWY 構文を調整したいならマクロじゃない?
let v = safe_get!(v, {
失敗した
return Ok (());
});
みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。
let v = safe_get!(v, {
失敗した
return Ok (());
});
みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。
339デフォルトの名無しさん
2020/04/01(水) 10:13:55.16ID:0Fs3VJge なんでboolって1byteあるの?
340デフォルトの名無しさん
2020/04/01(水) 11:20:10.79ID:5VJq6KKK C は bit field あるのにな
341デフォルトの名無しさん
2020/04/01(水) 11:25:37.12ID:qjrNWUcZ >>335
map_or_elseでSomeの時とNoneの時に適用するクロージャを渡せる
でもどうしても1行で書きたいとかchainしたい場合じゃなければ普通にmatchかif-else使うな
fn foo(){
get().map_or_else(|| bar(), |x| baz(x))
}
fn foo(){
match get() {
None => bar(),
Some(x) => baz(x)
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dd9040426e54f1dfc6e39d07bbd219fb
map_or_elseでSomeの時とNoneの時に適用するクロージャを渡せる
でもどうしても1行で書きたいとかchainしたい場合じゃなければ普通にmatchかif-else使うな
fn foo(){
get().map_or_else(|| bar(), |x| baz(x))
}
fn foo(){
match get() {
None => bar(),
Some(x) => baz(x)
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dd9040426e54f1dfc6e39d07bbd219fb
342デフォルトの名無しさん
2020/04/01(水) 11:30:33.60ID:eoE2gHM2 >>341
クロージャ渡しじゃearly returnできないって話では?
クロージャ渡しじゃearly returnできないって話では?
343デフォルトの名無しさん
2020/04/01(水) 12:21:13.46ID:qjrNWUcZ344デフォルトの名無しさん
2020/04/01(水) 13:43:58.79ID:npfcBiID345デフォルトの名無しさん
2020/04/01(水) 14:12:02.37ID:Wuhu+msT ネストが嫌なんだから無理でしょ
ネストしないコードを書く人なんだろうけど
ネストしないコードを書く人なんだろうけど
346デフォルトの名無しさん
2020/04/01(水) 17:06:40.66ID:qjrNWUcZ >>344
なるほど理解した
どうしてもearly returnがしたくてunwrapも嫌なら
if letを2回やるか、is_none+if let Someでもいい気がする
マクロ書いてもidiomaticな形に比べて読みやすくなるかっていうと微妙なので
fn foo(x: &str) -> Result<()>{
let v = safe_get!(get(x), { …; return Ok(()) });
let v = baz(v)?;
qux(v)?
}
fn foo(x: &str) -> Result<()>{
if let Some(v) = get(x) {
let v = baz(v)?;
qux(v)?;
}
Ok(())
}
なるほど理解した
どうしてもearly returnがしたくてunwrapも嫌なら
if letを2回やるか、is_none+if let Someでもいい気がする
マクロ書いてもidiomaticな形に比べて読みやすくなるかっていうと微妙なので
fn foo(x: &str) -> Result<()>{
let v = safe_get!(get(x), { …; return Ok(()) });
let v = baz(v)?;
qux(v)?
}
fn foo(x: &str) -> Result<()>{
if let Some(v) = get(x) {
let v = baz(v)?;
qux(v)?;
}
Ok(())
}
347デフォルトの名無しさん
2020/04/01(水) 19:39:22.27ID:2vQ3PjhV "処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?
こういうSomeから取り出すだけの部分が冗長だから消えてなくなれつってんだよ
is_none()でやるのは構文保証ではなく"プログラマーの注意力"による保証だからクソだつってんだよ
let v = match foo.get() { Some(v) => v, None => {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
let v = if let Some(v) = foo.get() { v } else {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
こういうSomeから取り出すだけの部分が冗長だから消えてなくなれつってんだよ
is_none()でやるのは構文保証ではなく"プログラマーの注意力"による保証だからクソだつってんだよ
let v = match foo.get() { Some(v) => v, None => {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
let v = if let Some(v) = foo.get() { v } else {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
348デフォルトの名無しさん
2020/04/01(水) 20:41:14.76ID:SX13wyIA349デフォルトの名無しさん
2020/04/01(水) 20:49:40.54ID:/Onfa91A 宣言的な書き方の基本が分かってないんやろな
Rust以前のレベル
Rust以前のレベル
350デフォルトの名無しさん
2020/04/01(水) 21:05:02.98ID:SX13wyIA351デフォルトの名無しさん
2020/04/01(水) 21:36:42.23ID:SEIF3iTR 言語としても長い間議論があったみたいだけど、まとまらなかったみたいね
https://github.com/rust-lang/rfcs/pull/1303
https://github.com/rust-lang/rfcs/pull/1303
352デフォルトの名無しさん
2020/04/01(水) 21:36:47.02ID:qjrNWUcZ >>347
>"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?
えっ、 Errでラップして返してる?
まぁそれはいいとしてearly returnだけじゃなく
戻り値の型と取り出した値をどうするかをセットで考えてないから
そうなっちゃうんだと思うよ
>"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?
えっ、 Errでラップして返してる?
まぁそれはいいとしてearly returnだけじゃなく
戻り値の型と取り出した値をどうするかをセットで考えてないから
そうなっちゃうんだと思うよ
353デフォルトの名無しさん
2020/04/01(水) 22:01:23.20ID:SX13wyIA RFCざっと見てきたけど、あっちでも
「map_errでいいんじゃ?」「return;できねーよ」ってやってるな。
そんなに難解なリクエストでもないと思うんだが。
「map_errでいいんじゃ?」「return;できねーよ」ってやってるな。
そんなに難解なリクエストでもないと思うんだが。
354デフォルトの名無しさん
2020/04/01(水) 22:20:38.50ID:0Fs3VJge fn check<T>(mut f: impl FnMut(T) -> bool)
と
fn check<T, F>(mut f: F)
where F: FnMut(T) -> bool
って同意義ですか?
と
fn check<T, F>(mut f: F)
where F: FnMut(T) -> bool
って同意義ですか?
355デフォルトの名無しさん
2020/04/02(木) 03:46:30.54ID:0zdT1xZ7356デフォルトの名無しさん
2020/04/02(木) 03:48:18.19ID:0zdT1xZ7 なお、このような場合の whereは、日本人感覚からすれば、ifと読み替えてもいい。
357デフォルトの名無しさん
2020/04/02(木) 05:35:03.07ID:zwgg3bUK 前者の場合 check::<T, F>() でコールできるが後者はできない
358デフォルトの名無しさん
2020/04/02(木) 17:07:56.47ID:SaXsz2/b 前者と後者が逆?
359デフォルトの名無しさん
2020/04/02(木) 20:28:06.36ID:7RFFBbbD これ
https://docs.rs/try_or/0.2.0/try_or/macro.try_opt_or_else.html
Unwraps an Option. If the result is None, calls the function $or_fn and returns its result.
https://docs.rs/try_or/0.2.0/try_or/macro.try_opt_or_else.html
Unwraps an Option. If the result is None, calls the function $or_fn and returns its result.
360デフォルトの名無しさん
2020/04/02(木) 21:53:44.49ID:zwgg3bUK >>358
逆にだったすまん
逆にだったすまん
361デフォルトの名無しさん
2020/04/02(木) 23:30:20.89ID:SaXsz2/b そもそもcheck::<T, F>()じゃ引数渡してないから呼び出せなくない? 試してないけど
362デフォルトの名無しさん
2020/04/03(金) 00:13:24.70ID:RIPEgpHK 構文で解決すべきところを皆が俺俺マクロで解決して統一感ない状態を生むのが良いと考えるやついるのか?
363デフォルトの名無しさん
2020/04/03(金) 00:44:31.97ID:11HfTHW1 if foo.is_none() {
シンプルにこれでいいと思うんだが...
これぐらいの細かい挙動で構文拡張しろとかマクロ書けとかなったらC++みたいになっていくのが目に見えるしから嫌だわ
しかもこんな嫌だ嫌だ言ってて質問する立場なのにこんな逆ギレもしてて救いようがない
シンプルにこれでいいと思うんだが...
これぐらいの細かい挙動で構文拡張しろとかマクロ書けとかなったらC++みたいになっていくのが目に見えるしから嫌だわ
しかもこんな嫌だ嫌だ言ってて質問する立場なのにこんな逆ギレもしてて救いようがない
364デフォルトの名無しさん
2020/04/03(金) 00:44:38.25ID:8O7qKRUc 現状は335が冗長と言う状態で統一されてるんだからいいんじゃないの。
その冗長さをどうしても許容できない人は(少数派である以上)マクロで解決するしかないし、もし大多数が賛同できる新構文を思い付いたならRFC出せばいい。
その冗長さをどうしても許容できない人は(少数派である以上)マクロで解決するしかないし、もし大多数が賛同できる新構文を思い付いたならRFC出せばいい。
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と同じ書き忘れのリスクを伴う"プログラマの注意力"を消耗するだけのゴミだろ
is_none()は==NULLや==nilと同じ書き忘れのリスクを伴う"プログラマの注意力"を消耗するだけのゴミだろ
367デフォルトの名無しさん
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%の外れ値処理をした後のものみたい
サンプルの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だったときの処理書けないしょ
369デフォルトの名無しさん
2020/04/03(金) 23:35:51.11ID:gSdeIOHU 最近勉強し始めたんだけどムズすぎ😭
370デフォルトの名無しさん
2020/04/04(土) 00:07:28.35ID:cnL2FB3T rust実用化に成功したプロジェクトって何があるの?お前らの会社では成功してるの?
371デフォルトの名無しさん
2020/04/04(土) 00:29:58.91ID:hnhE9+15 実用化って何
372デフォルトの名無しさん
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
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としているかんじ
イメージ的にはUtc{}.ymdとしているかんじ
375デフォルトの名無しさん
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
https://doc.rust-lang.org/src/core/iter/mod.rs.html#371-422
377デフォルトの名無しさん
2020/04/04(土) 17:26:12.04ID:9lNQDQEm pub が付いてないものをそんなに簡単に使えたらモジュールの意味がないやろ……。
378デフォルトの名無しさん
2020/04/04(土) 17:26:43.72ID:9lNQDQEm そのモジュールをコピペして新しいモジュールを作れば自由に出来るんとちゃう?
379デフォルトの名無しさん
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
具体的には
https://docs.rs/image/0.23.2/image/struct.Frames.htmlの
pub fn new(iterator: Box<dyn Iterator<Item = ImageResult<Frame>> + 'a>) -> Self
380デフォルトの名無しさん
2020/04/04(土) 20:42:49.37ID:oHbtMe0Y iteratorを受け取ってSelfを返す。
iteratorは各要素がImageResult<Frame>のもの
Box<dyn …>してるのはコンパイル時にTrait ObjecのSizeが決まるようにするため
(Generics使えば不要)
‘aはiteratorのlifetimeをSelfのlifetimeにするため
iteratorは各要素がImageResult<Frame>のもの
Box<dyn …>してるのはコンパイル時にTrait ObjecのSizeが決まるようにするため
(Generics使えば不要)
‘aはiteratorのlifetimeをSelfのlifetimeにするため
381デフォルトの名無しさん
2020/04/04(土) 22:54:06.10ID:BQ+xJjAs382デフォルトの名無しさん
2020/04/05(日) 10:19:35.11ID:LNp8foc9 >>381
dyn は C++ で言う抽象クラスみたいなもんだよ。
トレイトオブジェクトというのは実際にはそのトレイトを実装している様々な型の可能性があって、
それら全てを格納可能な大きさはわからない。
Box は C/C++ でいうポインタみたいな用途で使われる。
大きさがわからなくてもオブジェクトの場所を指すことは出来る。
「そのトレイトを実装している型ならなんでも」と「そのトレイトを実装している型のいずれか」というのは違う意味で、
ジェネリクスは後者。
言い換えると、実行時にディスパッチされる多相とコンパイル時にディスパッチされる多相ってこと。
コンパイル時に型がわかるのなら大きさもコンパイル時にわかる。
大きさがわかるなら Box を経由しなくていい。
ライフタイムの 'a は Frames の型引数の 'a と同じだから、
new の返り値 (Self) の寿命は iterator の寿命と同じになる。
dyn は C++ で言う抽象クラスみたいなもんだよ。
トレイトオブジェクトというのは実際にはそのトレイトを実装している様々な型の可能性があって、
それら全てを格納可能な大きさはわからない。
Box は C/C++ でいうポインタみたいな用途で使われる。
大きさがわからなくてもオブジェクトの場所を指すことは出来る。
「そのトレイトを実装している型ならなんでも」と「そのトレイトを実装している型のいずれか」というのは違う意味で、
ジェネリクスは後者。
言い換えると、実行時にディスパッチされる多相とコンパイル時にディスパッチされる多相ってこと。
コンパイル時に型がわかるのなら大きさもコンパイル時にわかる。
大きさがわかるなら Box を経由しなくていい。
ライフタイムの 'a は Frames の型引数の 'a と同じだから、
new の返り値 (Self) の寿命は iterator の寿命と同じになる。
383デフォルトの名無しさん
2020/04/05(日) 11:42:45.53ID:/6aVgV0B Boxと&dynの違いって参照元がヒープかスタックかの違い?
384デフォルトの名無しさん
2020/04/05(日) 14:13:55.26ID:8bGOOvBY >>383
そう
そう
385デフォルトの名無しさん
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も書いてるように前者は動的ディスパッチ、後者は静的ディスパッチなので
異なる型が混在するコレクションを使いたい時やバイナリサイズを小さくしたい時以外は
ジェネリクスを選ぶほうが一般的
大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない
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も書いてるように前者は動的ディスパッチ、後者は静的ディスパッチなので
異なる型が混在するコレクションを使いたい時やバイナリサイズを小さくしたい時以外は
ジェネリクスを選ぶほうが一般的
386デフォルトの名無しさん
2020/04/05(日) 17:53:06.31ID:fOt2g8TG あーなんとなくわかってっきた
ジェネリクスと同じことがトレイトオブジェクトでも実現できて、その書き方がBox<dyn...>ということか
ジェネリクスと同じことがトレイトオブジェクトでも実現できて、その書き方がBox<dyn...>ということか
387デフォルトの名無しさん
2020/04/05(日) 19:06:03.32ID:LNp8foc9 同じことって言っちゃうと語弊がある気がするなぁ。
388デフォルトの名無しさん
2020/04/05(日) 21:52:05.83ID:/6aVgV0B そもそもRustはかなり型のサイズに厳しいけどなんで?
コンパイラの最適化のため?
コンパイラの最適化のため?
389デフォルトの名無しさん
2020/04/05(日) 22:38:29.83ID:8bGOOvBY >>388
他言語なら暗黙的に参照として扱われるようなものも
明示的に&を付けたりBox化することを求めるから厳しく感じるんだと思う
明示的に求めるのはowned/shared/mutableの3つを
一貫性を持って区別して書くようにっていう設計選択じゃないかな
>大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない
↑これ他言語でも常識かもしれないけど自分はRustやるまで意識したことなかったよ
他言語なら暗黙的に参照として扱われるようなものも
明示的に&を付けたりBox化することを求めるから厳しく感じるんだと思う
明示的に求めるのはowned/shared/mutableの3つを
一貫性を持って区別して書くようにっていう設計選択じゃないかな
>大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない
↑これ他言語でも常識かもしれないけど自分はRustやるまで意識したことなかったよ
390デフォルトの名無しさん
2020/04/05(日) 23:09:09.40ID:/qXmUwFk391デフォルトの名無しさん
2020/04/05(日) 23:12:44.10ID:/qXmUwFk 途中で送ってしもた。
rustでは当たり前に見えるけどこんな事してるのrustくらいでヒープが必要ならクロージャさえも自分でbox化する必要がある。
rustでは当たり前に見えるけどこんな事してるのrustくらいでヒープが必要ならクロージャさえも自分でbox化する必要がある。
392デフォルトの名無しさん
2020/04/05(日) 23:13:46.13ID:dvIeqTXE スタック上に長さ不定のデータが作れるとバグの温床になる。
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★5 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★6 [BFU★]
- 中国側が首相答弁の撤回要求、日本側拒否★2 [夜のけいちゃん★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 日本人にゲームでキャラメイクさせると鼻が棒みたいになるよな 異常に小鼻を憎んでるよなキモオタって [817148728]
- 鈴木農水大臣「コメの価格が上がってるのは新米に切り替わったからです」 [256556981]
- ホテル業界、高市のせいで中国から大量キャンセル 「大変厳しい状態。一刻も早い収束を願います」 [271912485]
- 【正論】玉木雄一郎「高市さんの答弁は米軍が攻撃を受けた場合を前提としており、撤回するのは難しい」特定野党を完全論破 [519511584]
- 麻生太郎氏、高市政権と距離を置きはじめる(´・ω・`) [399259198]
- んなり放題🍬のお🏡
