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
レス数が1000を超えています。これ以上書き込みはできません。
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
2デフォルトの名無しさん
2020/01/24(金) 12:03:40.01ID:ytRnz1Ft このスレにバグがある確率
↓
↓
3デフォルトの名無しさん
2020/01/24(金) 13:58:51.88ID:rcCZSgTk この世のC/C++プログラムにバグが一つでもあるぐらい%
2020/01/24(金) 15:10:27.64ID:2IgFvbdV
2020/01/24(金) 23:17:19.37ID:CbfOEjVR
質問です。
こんな構造体を作っていました。
struct Iter<T: Iterator> {
buffer : Option<char>,
iter : T
}
このとき T::Item が char であるような制限を表現する方法はありますか?
こんな構造体を作っていました。
struct Iter<T: Iterator> {
buffer : Option<char>,
iter : T
}
このとき T::Item が char であるような制限を表現する方法はありますか?
2020/01/25(土) 00:04:14.38ID:m3Nt4oA+
struct Iter<T: Iterator<Item=char>>
2020/01/25(土) 00:07:06.67ID:NV/40SqZ
8デフォルトの名無しさん
2020/01/25(土) 09:25:49.56ID:yPlwm7j6 どういたしまして
9デフォルトの名無しさん
2020/01/25(土) 10:02:56.84ID:cxLY0DeL ミスがある前提で作られたソフトウェアなんぞ使いたくないわ。
2020/01/25(土) 10:26:45.49ID:m3Nt4oA+
個人のミスが重大な問題にならないようシステムで防ぐんだぞ
1つのミスがそのままProductionのバグになるわけじゃないから
個々の部品が予期しない故障をする前提で設計したシステムと
個々の部品は想定外の故障はしない前提で設計したシステムと
どちらのほうが高い信頼性を実現できるのかは歴史を見れば明らか
だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる
1つのミスがそのままProductionのバグになるわけじゃないから
個々の部品が予期しない故障をする前提で設計したシステムと
個々の部品は想定外の故障はしない前提で設計したシステムと
どちらのほうが高い信頼性を実現できるのかは歴史を見れば明らか
だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる
2020/01/25(土) 10:50:03.15ID:hZDj10w+
ミスをしないエンジニアは存在する
俺だ
俺だ
12デフォルトの名無しさん
2020/01/25(土) 10:53:31.57ID:cxLY0DeL2020/01/25(土) 10:59:09.24ID:cUlFTyRf
14デフォルトの名無しさん
2020/01/26(日) 03:02:59.13ID:0RGBrSLm https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=511e2be2ae90342a9c36f759e73108b6
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです
2020/01/26(日) 14:50:16.22ID:0RGBrSLm
返す変数間違ってました
2020/01/26(日) 15:15:02.80ID:0RGBrSLm
あーなんかいろいろ間違ってたんで出直します
2020/01/26(日) 17:36:36.36ID:HuWRexcG
プルリクとかも出す前にさんざん確認してんのに出してからすぐ「あ、ここ間違ってた…」みたいになるよね(´・ω・`)
18デフォルトの名無しさん
2020/01/26(日) 21:41:08.18ID:afCDhAgp Vec<String> を拡張すると定義外ってエラー出るんですけどなんでかわかる人います?
他のライブラリでVec拡張してるソース見ると特殊なことせずにimplできてるんですけどどうすればこのエラー取り除けますか?
impl From<Vec<&str>> for Vec<String> {
fn from(v: Vec<&str>) -> Self {
v.into_iter().map(String::from).collect()
}
}
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
88 | impl From<Vec<&str>> for Vec<String> {
| ^^^^^---------------^^^^^-----------
| | | |
| | | `std::vec::Vec` is not defined in the current crate
| | `std::vec::Vec` is not defined in the current crate
| impl doesn't use only types from inside the current crate
|
他のライブラリでVec拡張してるソース見ると特殊なことせずにimplできてるんですけどどうすればこのエラー取り除けますか?
impl From<Vec<&str>> for Vec<String> {
fn from(v: Vec<&str>) -> Self {
v.into_iter().map(String::from).collect()
}
}
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
88 | impl From<Vec<&str>> for Vec<String> {
| ^^^^^---------------^^^^^-----------
| | | |
| | | `std::vec::Vec` is not defined in the current crate
| | `std::vec::Vec` is not defined in the current crate
| impl doesn't use only types from inside the current crate
|
2020/01/26(日) 22:08:40.96ID:ux8Vy6ZU
>>18
ざっくりいうと
外部crateで定義された型 + 外部crateで定義されたtrait
の組み合わせでインプリするのは無理
どっちか片方が自crateで定義されたものなら問題ない
coherence ruleとかorphan ruleとかいうやつ
https://doc.rust-lang.org/error-index.html#E0117
ざっくりいうと
外部crateで定義された型 + 外部crateで定義されたtrait
の組み合わせでインプリするのは無理
どっちか片方が自crateで定義されたものなら問題ない
coherence ruleとかorphan ruleとかいうやつ
https://doc.rust-lang.org/error-index.html#E0117
20デフォルトの名無しさん
2020/01/26(日) 23:22:19.61ID:afCDhAgp >>19
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな
2020/01/27(月) 17:44:19.37ID:e3ktUGSY
こんな関数は書けますか?
@ イテレータを受け取る
A 受け取る引数は @ のただひとつのみ
B 条件を満たす範囲を「スライスで」返す
スライスを作る記法は &s[1..10] みたいな感じなのでスライスの元になるオブジェクト s が必要なように見えますが、
スライスを返したいというのはいかにもありそうなことなので出来ないはずはないだろうという思いもあります。
イテレータは実際にはなんらかのシーケンスをたどるものではなく値の生成器である場合もありますが、
それらを区別するような制約を表現できますか?
@ イテレータを受け取る
A 受け取る引数は @ のただひとつのみ
B 条件を満たす範囲を「スライスで」返す
スライスを作る記法は &s[1..10] みたいな感じなのでスライスの元になるオブジェクト s が必要なように見えますが、
スライスを返したいというのはいかにもありそうなことなので出来ないはずはないだろうという思いもあります。
イテレータは実際にはなんらかのシーケンスをたどるものではなく値の生成器である場合もありますが、
それらを区別するような制約を表現できますか?
2020/01/27(月) 18:55:02.93ID:Ad8VU0Ek
2020/01/27(月) 22:07:00.22ID:0eef+IwM
スライスは連続したメモリ領域である必要があって
任意のイテレータがその条件を満たすのは不可能。
たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
ただ普通はイテレータ返してランダムアクセス必要なタイミングでcollectすると思う。
任意のイテレータがその条件を満たすのは不可能。
たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
ただ普通はイテレータ返してランダムアクセス必要なタイミングでcollectすると思う。
2020/01/27(月) 22:21:05.46ID:0eef+IwM
あと標準のイテレータは特に値の生成方法に関する型制約はないので
区別したいなら独自のイテレータ型を作って
標準イテレータへの変換を実装する感じかな。
区別したいなら独自のイテレータ型を作って
標準イテレータへの変換を実装する感じかな。
2020/01/27(月) 22:29:13.49ID:ZEgWdqLw
入力が連続したメモリ領域だってんなら引数をイテレータじゃなくてスライスにすればいい
当たり前だけどスライスを作れるもの以外からはスライスは作れないからな
当たり前だけどスライスを作れるもの以外からはスライスは作れないからな
2020/01/27(月) 22:46:49.78ID:ZEgWdqLw
ごめん、なんか変なこと言ってるわ・・・スルーして
2020/01/27(月) 23:06:14.69ID:Ad8VU0Ek
>>23
>たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
イテレータを受け取ってスライスを返すとした場合
スライスの元になってるシーケンスのlifetimeが関数内に閉じるから
unsafe使ったとしてもborrow checkerにひっかからない?
>たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
イテレータを受け取ってスライスを返すとした場合
スライスの元になってるシーケンスのlifetimeが関数内に閉じるから
unsafe使ったとしてもborrow checkerにひっかからない?
2020/01/27(月) 23:19:10.77ID:2FR/nuYZ
>>27
from_raw_partsでスライスを作った場合は元のポインタ由来のライフタイムは関係なくなるので
ボローチェッカは通るんじゃないかな?
もちろんそのスライスの実体が生きているかどうかは
自己責任になるけど。
from_raw_partsでスライスを作った場合は元のポインタ由来のライフタイムは関係なくなるので
ボローチェッカは通るんじゃないかな?
もちろんそのスライスの実体が生きているかどうかは
自己責任になるけど。
2020/01/28(火) 00:18:00.02ID:nzUBCcWX
>>28
なるほど
イテレータからイテレータの元のシーケンスが取得できればそれでいけるってことか
ちょっと見てみたらslice::Iterのas_sliceとかも内部でfrom_raw_parts使ってた
自分では使わないと思うけど勉強になった
なるほど
イテレータからイテレータの元のシーケンスが取得できればそれでいけるってことか
ちょっと見てみたらslice::Iterのas_sliceとかも内部でfrom_raw_parts使ってた
自分では使わないと思うけど勉強になった
30デフォルトの名無しさん
2020/01/28(火) 10:36:24.22ID:ijxMtirO RustでOSのkernel描いてる例ある?
3121
2020/01/28(火) 10:56:11.58ID:jIEBko3c >>22-29
ありがとうございます。
スライスの役目や Rust の習慣について誤解していたみたいです。
【誤解】
スライスは範囲を表現する高級なオブジェクト
Vec にも配列にも使えるのでコンテナ全般に使えると思った
【正解】
スライスは「メモリの」範囲を表現するオブジェクト
実体としてはいわゆる fat pointer
【背景】
Vec は内部的に連続したメモリ領域で管理しているので普通の配列のようにスライスを作れる
C++ でいえば vector の data や string の c_str みたいなもの
【見落とし】
配列でも Vec でもスライスの型表記は同じなのでどうしてだろうと気にかかってはいたが掘り下げて調べなかった
型が同じなのは実際に同じだからなわけですね
ありがとうございます。
スライスの役目や Rust の習慣について誤解していたみたいです。
【誤解】
スライスは範囲を表現する高級なオブジェクト
Vec にも配列にも使えるのでコンテナ全般に使えると思った
【正解】
スライスは「メモリの」範囲を表現するオブジェクト
実体としてはいわゆる fat pointer
【背景】
Vec は内部的に連続したメモリ領域で管理しているので普通の配列のようにスライスを作れる
C++ でいえば vector の data や string の c_str みたいなもの
【見落とし】
配列でも Vec でもスライスの型表記は同じなのでどうしてだろうと気にかかってはいたが掘り下げて調べなかった
型が同じなのは実際に同じだからなわけですね
32デフォルトの名無しさん
2020/01/28(火) 12:14:44.10ID:w1x5kgyo 質問あると自分の理解が怪しいのが分かって助かるわ。
33デフォルトの名無しさん
2020/01/28(火) 19:57:36.65ID:DC7dbBDx let template = if spaces { "{1}{0}{1}" } else { "{1}{0}" };
format!(template, 1, 2);
これだとリテラルかけってエラー出るだけど、解決方法ないかな?
format!(template, 1, 2);
これだとリテラルかけってエラー出るだけど、解決方法ないかな?
2020/01/28(火) 20:03:41.33ID:UeuUZ8OR
iter[1..4]とか書けた方がiter.skil(1).take(4).collect()よりシンプルでええやん!
とは思ったが、そういう使い方したらそもそも駄目よ、という意思が表れているのかもしれん
とは思ったが、そういう使い方したらそもそも駄目よ、という意思が表れているのかもしれん
2020/01/28(火) 20:21:31.82ID:F/6MF06M
36デフォルトの名無しさん
2020/01/28(火) 22:00:20.47ID:DC7dbBDx >>34
range(&self, from: usize, to: usize) -> Option
があればいいのにね
>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね
range(&self, from: usize, to: usize) -> Option
があればいいのにね
>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね
2020/01/28(火) 22:12:59.36ID:hojGZimv
>>36
いえいえ
いえいえ
2020/01/28(火) 22:31:23.29ID:KmVlGMrW
39デフォルトの名無しさん
2020/01/29(水) 00:56:46.27ID:OlGAjZi3 collectを二度書くと罪悪感で一度にならないか一生懸命考える
2020/01/29(水) 02:14:46.64ID:V4INQ4I7
>>33
単純な用途ならリテラル返すマクロを書くといいかも
複雑な用途ならテンプレートエンジンかな
macro_rules! my_format {
(true) => ("{1}{0}{1}");
(false) => ("{1}{0}");
}
println!(my_format!(true), 1, 2);
単純な用途ならリテラル返すマクロを書くといいかも
複雑な用途ならテンプレートエンジンかな
macro_rules! my_format {
(true) => ("{1}{0}{1}");
(false) => ("{1}{0}");
}
println!(my_format!(true), 1, 2);
2020/02/01(土) 18:37:08.80ID:saBYxsru
https://tech-blog.optim.co.jp/entry/2019/07/18/173000#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E6%B4%BB%E7%94%A8
のデバッグ機能の追加のところを読んで一通り導入してみたんだが、ブレークポイントで止まったところがなぜかバイナリ表示になってしまう
解決策を教えてください
のデバッグ機能の追加のところを読んで一通り導入してみたんだが、ブレークポイントで止まったところがなぜかバイナリ表示になってしまう
解決策を教えてください
2020/02/02(日) 05:59:15.53ID:DhujQgFD
Slackで聞け
2020/02/02(日) 19:09:35.21ID:Ng7YaIlp
>>41
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない
単純にdebug symbolが有効になってないとか?
launch.jsonのcargoのコマンド確認してそれでbuildしたバイナリを
rust-lldbでデバッグできるかどうかで切り分けてみたら?
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない
単純にdebug symbolが有効になってないとか?
launch.jsonのcargoのコマンド確認してそれでbuildしたバイナリを
rust-lldbでデバッグできるかどうかで切り分けてみたら?
2020/02/02(日) 21:47:21.49ID:RNwzrPPX
解決しました
上記はMac用のデバッグのやり方のようです
上記はMac用のデバッグのやり方のようです
2020/02/04(火) 01:45:10.19ID:5y86WC+2
vscodeでrust始めたんだけどオートコンプリートがまともに働いてくれてない気がする
メソッド内の変数だと候補を出したり出さなかったりする
メソッド内の変数だと候補を出したり出さなかったりする
2020/02/04(火) 02:12:55.41ID:Pt7gvJNj
>>45
vscodeやめてインテリなんとか使えば?
vscodeやめてインテリなんとか使えば?
2020/02/04(火) 02:38:52.83ID:w9dkRQaa
vscode での Rust の補完って LSP を使うんでないの?
処理系と連携するって最強じゃんと思ってたんだが。
処理系と連携するって最強じゃんと思ってたんだが。
2020/02/04(火) 20:47:39.21ID:3rIDek9/
コンパイラから出てくる補完情報が成熟してないんで、まだ完璧には遠い
独自の解析はracerとintellij rustがやってて、精度はintellijの方が高い
あんまIDE使いたくないからrlsには頑張って欲しい
独自の解析はracerとintellij rustがやってて、精度はintellijの方が高い
あんまIDE使いたくないからrlsには頑張って欲しい
49デフォルトの名無しさん
2020/02/04(火) 21:22:29.69ID:YIjVTtZH 本体のソース見たいけど/* compiler built-in */ってなってて読めない。
どうやったら見れる?
どうやったら見れる?
2020/02/05(水) 23:43:19.76ID:85RuEno5
Rust の char::is_ascii とかは pub const fn is_ascii(&self) -> bool なのに is_whitespace とかは pub fn is_whitespace(self) -> bool みたいになってるのなんでだろ?
&self でも self でもどっちかに統一してよさそうな気がするんだけど。
&self でも self でもどっちかに統一してよさそうな気がするんだけど。
2020/02/05(水) 23:45:58.49ID:D4pcZnSz
なんかツイッターで以下2つについてコンパイルできねーっていうつぶやきがあったんですが、
試してみたらコンパイルできちゃったんですがどういうことなのでしょう
Rust2015/2018どっちでもコンパイルできちゃいました
//その1
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);
参照元yの変数宣言が参照先のxより先に変数宣言されたからエラー。
//その2
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x); //これがエラー
試してみたらコンパイルできちゃったんですがどういうことなのでしょう
Rust2015/2018どっちでもコンパイルできちゃいました
//その1
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);
参照元yの変数宣言が参照先のxより先に変数宣言されたからエラー。
//その2
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x); //これがエラー
2020/02/05(水) 23:58:35.71ID:sFY5zr3G
>>50
is_asciiはstrやsliceにもあるからそれに揃えたんじゃないかな
is_asciiはstrやsliceにもあるからそれに揃えたんじゃないかな
2020/02/06(木) 00:18:39.33ID:yO6jvvKT
2020/02/06(木) 00:30:48.24ID:kEyn3Q9D
drop順でエラーになってたやつだね
2020/02/06(木) 00:59:10.03ID:jSrTrJa0
>>52
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?
ワイはまだ初心者で Rust 脳になりきれてないんだけど、参照渡しってのは実質的に (C/C++ で言うところの) ポインタをやりとりしてる感じでしょ?
(単純な場合は最適化で消えると思うけど。)
char 程度の大きさならポインタを渡すのでもコピーして渡すのでも差はないし、ポインタだと間接参照になる分だけ無駄っぽい。
という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?
ワイはまだ初心者で Rust 脳になりきれてないんだけど、参照渡しってのは実質的に (C/C++ で言うところの) ポインタをやりとりしてる感じでしょ?
(単純な場合は最適化で消えると思うけど。)
char 程度の大きさならポインタを渡すのでもコピーして渡すのでも差はないし、ポインタだと間接参照になる分だけ無駄っぽい。
という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。
2020/02/06(木) 01:31:54.89ID:yO6jvvKT
2020/02/06(木) 01:51:52.29ID:jSrTrJa0
58デフォルトの名無しさん
2020/02/06(木) 11:48:46.94ID:GExFx9na The Rust Programming Language 第2版で勉強中なんだけど
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい
2020/02/06(木) 14:10:02.33ID:kEyn3Q9D
https://www.rust-lang.org/learn
このページの上のほうにある3つのボタンがそれそれ
1. The Bookの最新版
2. Rustlings course(練習問題的なやつ)
3. Rust by Example(使用例)
英語で問題ないなら2018対応してる最新のThe Book読んだほうがいいかも
このページの上のほうにある3つのボタンがそれそれ
1. The Bookの最新版
2. Rustlings course(練習問題的なやつ)
3. Rust by Example(使用例)
英語で問題ないなら2018対応してる最新のThe Book読んだほうがいいかも
2020/02/06(木) 14:27:06.44ID:jSrTrJa0
英語がしんどい人 (日本語しかわからん人) にオススメなのはありますか?
2020/02/06(木) 15:54:58.65ID:kEyn3Q9D
The Bookの日本語版かオライリーの訳本
https://doc.rust-jp.rs/book-ja-pdf/book.pdf
https://www.oreilly.co.jp/books/9784873118550/
原著で読んだから訳の良し悪しはわからないけど
The Book含めて数冊読んだ中ではオライリー本が圧倒的にわかりやすかった
https://doc.rust-jp.rs/book-ja-pdf/book.pdf
https://www.oreilly.co.jp/books/9784873118550/
原著で読んだから訳の良し悪しはわからないけど
The Book含めて数冊読んだ中ではオライリー本が圧倒的にわかりやすかった
2020/02/06(木) 20:07:27.95ID:oYYwjpH2
手を動かしたいなら自転車本もあり
オライリーはちょっと古くなってるからなー
オライリーはちょっと古くなってるからなー
2020/02/06(木) 22:23:34.76ID:kEyn3Q9D
オライリー本の古くなってる箇所はEdition Guide読めば問題ないよ
多少古くてもOwnershipやLifetimeあたりの重要コンセプトをわかりやすく書いてるものがおすすめ
多少古くてもOwnershipやLifetimeあたりの重要コンセプトをわかりやすく書いてるものがおすすめ
2020/02/06(木) 22:57:58.42ID:ui7lN2G4
>>58みたいに英語でいいならrustupでインストールしたら付いてくるdocとそのリンク先にあるやつ読んだほうが良いぞ。
// ランタイム持ってないからasync/awaitがゼロコスト理論斬新すぎる
// ランタイム持ってないからasync/awaitがゼロコスト理論斬新すぎる
2020/02/07(金) 16:10:10.85ID:Q1mDvO6J
自クレートの名前やバージョンを取得するマクロって無かったっけ?
2020/02/07(金) 16:23:48.41ID:BIRgOLIs
Rust のライブラリって検索できるようになってるじゃん?
あれって名前だけじゃなくて引数の型とかで検索できたりしないのかなぁ。
Haskell (GHC) の Hoogle みたいに
あれって名前だけじゃなくて引数の型とかで検索できたりしないのかなぁ。
Haskell (GHC) の Hoogle みたいに
2020/02/07(金) 16:25:17.48ID:BIRgOLIs
>>67
あ、 Inparameters ってやつをクリックすれば出てくるのか。
あ、 Inparameters ってやつをクリックすれば出てくるのか。
2020/02/07(金) 16:30:12.12ID:aVy5/bny
2020/02/07(金) 16:36:53.27ID:Q1mDvO6J
>>69
それだ!ありがとう
それだ!ありがとう
2020/02/07(金) 16:54:52.66ID:BIRgOLIs
>>69
へー。
そのための専用のマクロってわけじゃなくて cargo が環境変数を設定してくれるって話なのね。
Cargo.toml を見ないとわかるはずもないからなんらかの連携があるのは当たり前といえば当たり前だけど。
へー。
そのための専用のマクロってわけじゃなくて cargo が環境変数を設定してくれるって話なのね。
Cargo.toml を見ないとわかるはずもないからなんらかの連携があるのは当たり前といえば当たり前だけど。
2020/02/10(月) 11:00:28.83ID:V3dAq4mT
io::Errorとかってprintln!("{:?}", err )とかしても
Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
みたいに出るだけで「どのファイル」かが分からないんですが、外部のクレートの関数から上のようなエラーが帰ってきた場合それが「どのファイル」によって起きてるのかというのはどうやって知れば良いんでしょうか?
Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
みたいに出るだけで「どのファイル」かが分からないんですが、外部のクレートの関数から上のようなエラーが帰ってきた場合それが「どのファイル」によって起きてるのかというのはどうやって知れば良いんでしょうか?
2020/02/10(月) 18:06:05.22ID:cKG4UD69
74デフォルトの名無しさん
2020/02/10(月) 20:19:23.72ID:vX14wve5 バイナリサイズはまだCの方が全然小さいけどRustはC以上になにが含まれてるの?
もちろん標準ライブラリとかは使ってないやつはバイナリに含まれないよね?
もちろん標準ライブラリとかは使ってないやつはバイナリに含まれないよね?
2020/02/10(月) 21:25:29.97ID:XC+zOH9l
2020/02/10(月) 22:55:31.36ID:t0EW4OCb
メモリ管理がランタイムにあるしdrop checkerもあるからランタイムはデカイよ。
77デフォルトの名無しさん
2020/02/10(月) 23:49:02.35ID:vX14wve52020/02/11(火) 00:10:31.83ID:v/oRLdRM
79テトリス ◆SYKnw8OJpw
2020/02/11(火) 00:36:46.52ID:DhLQ/nua Windows10のキャラクターがゴミ過ぎて無駄に苦労する
やっぱLinux使うしか無いんか?
でもゲームしたいからWindows環境が良いんだよな…
やっぱLinux使うしか無いんか?
でもゲームしたいからWindows環境が良いんだよな…
2020/02/11(火) 01:09:07.15ID:qG/miOyM
>>77
releaseでもデバッグシンボルはついてくる。
取って欲しいってIssueは立ってるけど
stripすればいいって感じなのか、あまり動きはない。
あとCのHelloWorldが小さいのはコードの大半が
libcにあるせいなのでは。
releaseでもデバッグシンボルはついてくる。
取って欲しいってIssueは立ってるけど
stripすればいいって感じなのか、あまり動きはない。
あとCのHelloWorldが小さいのはコードの大半が
libcにあるせいなのでは。
2020/02/11(火) 01:18:02.99ID:v/oRLdRM
バイナリサイズを小さくしたいならここを読む
https://github.com/johnthagen/min-sized-rust
https://github.com/johnthagen/min-sized-rust
2020/02/11(火) 18:54:33.07ID:Vv3Ln0ZS
組み込みで使おうなんて本気で考えてる奴はこんなところで聞いたりせんだろ。
2020/02/12(水) 12:54:11.29ID:F/O7jTJS
>>70
いえいえ
いえいえ
2020/02/17(月) 17:53:09.28ID:qpTD/rYC
cargo install mdbook
としたとき、依存するライブラリクレートも一斉にインストール (というかキャッシュみたいな扱い?) されたようです。
ローカルに入ったライブラリクレートのドキュメントから一斉に、網羅的に検索する仕組みはありますか?
標準ライブラリのドキュメントは名前や引数で検索できますが、それを手元に入っているライブラリ全てに拡大したようなものが欲しいです。
としたとき、依存するライブラリクレートも一斉にインストール (というかキャッシュみたいな扱い?) されたようです。
ローカルに入ったライブラリクレートのドキュメントから一斉に、網羅的に検索する仕組みはありますか?
標準ライブラリのドキュメントは名前や引数で検索できますが、それを手元に入っているライブラリ全てに拡大したようなものが欲しいです。
2020/02/17(月) 18:00:40.10ID:4asOCOmT
>>84
ビルド用の一時ディレクトリ以下に展開されただけで他から使えるようにはなってないよ
ビルド用の一時ディレクトリ以下に展開されただけで他から使えるようにはなってないよ
2020/02/17(月) 18:17:09.06ID:qpTD/rYC
>>85
そうなんですか。 Windows でやってるんですけど、
C:\Users\<ユーザー名>\.cargo\registry\src
に入っているのはビルド時の一時ファイル扱いという理解でいいんですかね?
他のプログラムをビルドしたときに必要になるライブラリクレートに共通するものが (このフォルダに) あったときでも
使いまわしはされないんでしょうか?
見かけ上は独立してるけど cargo が裏でうまいことやってくれるって感じなんでしょうか?
本当は Cargo book を読めばいいんでしょうけど、英語がわからなすぎて基本的な理念がよくわかってないです。
そうなんですか。 Windows でやってるんですけど、
C:\Users\<ユーザー名>\.cargo\registry\src
に入っているのはビルド時の一時ファイル扱いという理解でいいんですかね?
他のプログラムをビルドしたときに必要になるライブラリクレートに共通するものが (このフォルダに) あったときでも
使いまわしはされないんでしょうか?
見かけ上は独立してるけど cargo が裏でうまいことやってくれるって感じなんでしょうか?
本当は Cargo book を読めばいいんでしょうけど、英語がわからなすぎて基本的な理念がよくわかってないです。
2020/02/17(月) 20:49:03.97ID:P9Oy3OK5
$ cargo doc --open
doc生成すればプロジェクトの依存クレートすべてWeb形式で検索できるけど
そういうことではない?
doc生成すればプロジェクトの依存クレートすべてWeb形式で検索できるけど
そういうことではない?
2020/02/17(月) 22:42:46.96ID:ksspevQp
>>84
cargo installはバイナリクレートをインストールするためのワンライナーなんで
ライブラリクレートをどうこうする為のものではないよ。
バイナリのビルドに成功したら.cargo\binにコピーしてゴミは削除する。
バイナリクレートのドキュメントを読みたいならそれ自身を読みに行くんだよ。
rustdocは開発者向けでユーザー向けじゃない。
mdbookのrustdocが読みたいなら単にソースコードをクローンして自分でcargo doc叩けばビルドしてくれるけど。
cargo installはバイナリクレートをインストールするためのワンライナーなんで
ライブラリクレートをどうこうする為のものではないよ。
バイナリのビルドに成功したら.cargo\binにコピーしてゴミは削除する。
バイナリクレートのドキュメントを読みたいならそれ自身を読みに行くんだよ。
rustdocは開発者向けでユーザー向けじゃない。
mdbookのrustdocが読みたいなら単にソースコードをクローンして自分でcargo doc叩けばビルドしてくれるけど。
2020/02/18(火) 00:10:35.64ID:AiY0lHAj
構造体のメソッドでメンバ変数の値ひっぺがすのにstd::mem::take使うの面倒だな
9084
2020/02/18(火) 10:09:42.44ID:Nm2LYTxd >>87
「そのプロジェクト (に依存する全ての)」ではなく「ローカルに残っている全ての」というつもりでした。
>>88
> cargo installはバイナリクレートをインストールするためのワンライナーなんで
> ライブラリクレートをどうこうする為のものではないよ。
「為のものではない」ということは察していたんですが、
ライブラリのソースコードは残っているので裏で Cargo が動くために情報を残してもいるのだろう
と考えて特定のプロジェクトに限定せず横断的な処理をする方法があるのかどうかということを考えていました。
バイナリクレートをアップデートするときのために残してあるだけなんですかね……?
とりあえず、プロジェクトごとに独立していると考えておきます。
「そのプロジェクト (に依存する全ての)」ではなく「ローカルに残っている全ての」というつもりでした。
>>88
> cargo installはバイナリクレートをインストールするためのワンライナーなんで
> ライブラリクレートをどうこうする為のものではないよ。
「為のものではない」ということは察していたんですが、
ライブラリのソースコードは残っているので裏で Cargo が動くために情報を残してもいるのだろう
と考えて特定のプロジェクトに限定せず横断的な処理をする方法があるのかどうかということを考えていました。
バイナリクレートをアップデートするときのために残してあるだけなんですかね……?
とりあえず、プロジェクトごとに独立していると考えておきます。
2020/02/18(火) 10:18:22.88ID:dnK/GzEr
>>90
.cargoは全プロジェクト共通のキャッシュなので
プロジェクトまたいでも再利用はされる。
ただcargoコマンド自体はプロジェクト毎の操作しか提供しない、という感じ。
そういうツールを作ること自体は可能と思うけど。
.cargoは全プロジェクト共通のキャッシュなので
プロジェクトまたいでも再利用はされる。
ただcargoコマンド自体はプロジェクト毎の操作しか提供しない、という感じ。
そういうツールを作ること自体は可能と思うけど。
9284
2020/02/18(火) 10:59:25.45ID:Nm2LYTxd >>91
なるほど。
見かけ上はプロジェクトの独立性があるように抽象化されているという感じですね。
なるべくなら過去に使ったことのあるライブラリクレートから使えそうなものを
探した方がキャッシュ (?) の増大を抑えられるし、
よく使われるライブラリの方が信頼性が高いだろうというのが元々の動機でした。
ツールの使い方もおぼつかないので定番と言えるのがどのあたりなのかとかいった肌感覚もなくて、
実際のコードを色々と見て回るのにどういうやり方が良いのか模索しています。
なるほど。
見かけ上はプロジェクトの独立性があるように抽象化されているという感じですね。
なるべくなら過去に使ったことのあるライブラリクレートから使えそうなものを
探した方がキャッシュ (?) の増大を抑えられるし、
よく使われるライブラリの方が信頼性が高いだろうというのが元々の動機でした。
ツールの使い方もおぼつかないので定番と言えるのがどのあたりなのかとかいった肌感覚もなくて、
実際のコードを色々と見て回るのにどういうやり方が良いのか模索しています。
2020/02/20(木) 05:16:24.39ID:xc5wKacK
2020/02/20(木) 19:48:24.79ID:s7d9UeaP
Haskell の default 宣言みたいなのは Rust にありますか?
たとえば関数 foo が返す値の型が a もしくは b の可能性があり、
関数 bar が受け取る値の型が a もしくは b のときに bar(foo()) という式で型が定まりません。
このときに a と b の間での優先度を決める方法があるかという質問です。
具体的な状況があるわけではなくて、言語機能を学ぶ中で生じた疑問です。
たとえば関数 foo が返す値の型が a もしくは b の可能性があり、
関数 bar が受け取る値の型が a もしくは b のときに bar(foo()) という式で型が定まりません。
このときに a と b の間での優先度を決める方法があるかという質問です。
具体的な状況があるわけではなくて、言語機能を学ぶ中で生じた疑問です。
2020/02/20(木) 20:19:05.71ID:s7d9UeaP
>>93
こんな感じかな。
buf = buf.replace(ch, &<String as std::iter::FromIterator<&char>>::from_iter(&[' ', ch, ' ']));
こんな感じかな。
buf = buf.replace(ch, &<String as std::iter::FromIterator<&char>>::from_iter(&[' ', ch, ' ']));
2020/02/20(木) 20:57:27.42ID:xc5wKacK
>>95
thanks!
thanks!
2020/02/20(木) 21:07:18.17ID:uEuAMc9c
俺だったらformat!(" {} ", ch)にするかforを[" ( ", " ) ", ...]で回すかな
2020/02/20(木) 21:09:56.45ID:NbeJLDuu
2020/02/20(木) 21:27:49.34ID:ftgOjFn2
型が曖昧な時はだいたいターボフィッシュでなんとかなるやろ
100デフォルトの名無しさん
2020/02/20(木) 21:55:52.56ID:nsHNq1aE101デフォルトの名無しさん
2020/02/20(木) 22:48:30.93ID:OjLUij7y >>94
rustはsum typeしかない。それだと実行時に型を評価する方法とunion typeがいる。
rustはsum typeしかない。それだと実行時に型を評価する方法とunion typeがいる。
102デフォルトの名無しさん
2020/02/21(金) 01:30:08.71ID:8YUMmgA9 正直TypeScriptの1 | 2 の型記法欲しい
103デフォルトの名無しさん
2020/02/21(金) 08:48:56.60ID:jEzn3g3M >>94 って多分こういう事では?
trait X { ... }
impl a for X { ... }
impl b for X { ... }
fn foo<T: X>() -> T { ... }
fn bar<T: X>(_: T) { ... }
bar(foo())
Rust の文法詳しくないんで間違ってたらすまん
trait X { ... }
impl a for X { ... }
impl b for X { ... }
fn foo<T: X>() -> T { ... }
fn bar<T: X>(_: T) { ... }
bar(foo())
Rust の文法詳しくないんで間違ってたらすまん
104デフォルトの名無しさん
2020/02/21(金) 09:15:56.88ID:6JU7BGK210594
2020/02/21(金) 10:40:19.65ID:zBjm2h3y >>103-104
近いですが a と b との関係がもっと無関係なもの (仮想関数を使えない) を考えていました。
コードにするならこんな感じです。
struct Foo {}
struct Bar {}
trait X<T> { fn foo(&self) -> T; }
trait Y<T> { fn bar(&self, T); }
impl X<Foo> for Foo { fn foo(&self) -> Foo {Foo{}} }
impl X<Bar> for Foo { fn foo(&self) -> Bar {Bar{}} }
impl Y<Foo> for Bar { fn bar(&self, _x: Foo){} }
impl Y<Bar> for Bar { fn bar(&self, _x: Bar){} }
fn main() { Bar{}.bar(Foo{}.foo()); }
いずれにせよ方法はなさそうですね。
型を明記すればよい話ではあるのですが、ふと疑問に思ってしまったもので。
近いですが a と b との関係がもっと無関係なもの (仮想関数を使えない) を考えていました。
コードにするならこんな感じです。
struct Foo {}
struct Bar {}
trait X<T> { fn foo(&self) -> T; }
trait Y<T> { fn bar(&self, T); }
impl X<Foo> for Foo { fn foo(&self) -> Foo {Foo{}} }
impl X<Bar> for Foo { fn foo(&self) -> Bar {Bar{}} }
impl Y<Foo> for Bar { fn bar(&self, _x: Foo){} }
impl Y<Bar> for Bar { fn bar(&self, _x: Bar){} }
fn main() { Bar{}.bar(Foo{}.foo()); }
いずれにせよ方法はなさそうですね。
型を明記すればよい話ではあるのですが、ふと疑問に思ってしまったもので。
106デフォルトの名無しさん
2020/02/21(金) 13:18:50.41ID:sx356ht7 いや、こちらも勉強になるよ。
107デフォルトの名無しさん
2020/02/21(金) 15:11:57.88ID:RiyafmFC108デフォルトの名無しさん
2020/02/21(金) 15:21:44.11ID:RiyafmFC ターボフィッシュで指定するか型指定した変数で一旦受けるかだね
https://play.rust-lang.org/?gist=3d288900b3f655687d0ba22cc37cbb23
逆にこのケースでdefaultの型が決まっちゃうのってちょっと怖い
https://play.rust-lang.org/?gist=3d288900b3f655687d0ba22cc37cbb23
逆にこのケースでdefaultの型が決まっちゃうのってちょっと怖い
10994
2020/02/21(金) 18:02:02.28ID:zBjm2h3y Rust の型システム (Hindley-Milner) は ML 系言語で実績があるやつなので、
(型に関して) ML 系で出来ることはおおよそ出来るのではないかと思いつつ、
Rust 的には明記させたい場面かもな……みたいな気持ちでした。
やはり勝手に決まって欲しくないというのが Rust ユーザの感覚なんですね。
※ Haskell が ML 系と言えるかどうかは諸説あります
(型に関して) ML 系で出来ることはおおよそ出来るのではないかと思いつつ、
Rust 的には明記させたい場面かもな……みたいな気持ちでした。
やはり勝手に決まって欲しくないというのが Rust ユーザの感覚なんですね。
※ Haskell が ML 系と言えるかどうかは諸説あります
110デフォルトの名無しさん
2020/02/22(土) 01:53:24.77ID:eI8xgqVo これ出来たらかっこいい見たいな型推論の活用ってある?
111デフォルトの名無しさん
2020/02/22(土) 12:47:45.08ID:T3jMerUl ファントムタイプは(名前が)かっこいい
112デフォルトの名無しさん
2020/02/22(土) 16:08:52.19ID:5jIrjfcF C++ をやってた感覚から言うと Rust の str::parse っていいよね。
C++ は返却値の側からの推論が無いから普通の関数 (メンバ関数) として parse みたいなものを書けない。
いや、書けるけど型が推論されないからいちいち型を明記しなけりゃならない。
昔は演算子でやる C++ のスタイルを上手い案だと思ってたけど、
普通に関数 (メソッド) でやれるもんならその方がいいわ。
C++ は返却値の側からの推論が無いから普通の関数 (メンバ関数) として parse みたいなものを書けない。
いや、書けるけど型が推論されないからいちいち型を明記しなけりゃならない。
昔は演算子でやる C++ のスタイルを上手い案だと思ってたけど、
普通に関数 (メソッド) でやれるもんならその方がいいわ。
113デフォルトの名無しさん
2020/02/25(火) 12:01:50.32ID:35/v8OB/ 異なる関連型を持つ複数のトレイトオブジェクトを1つのVecに入れるのはAnyとかを使わないと無理でしょうか?
114デフォルトの名無しさん
2020/02/26(水) 07:52:56.79ID:Es0cXQkx IntelliJのRustプラグイン、ここのところぶっ壊れてないですか?
115デフォルトの名無しさん
2020/02/28(金) 06:03:14.29ID:4nSGV1YY 1.41.1
116デフォルトの名無しさん
2020/02/28(金) 12:10:25.14ID:Pr6ovKv/ これは大失態だな
117デフォルトの名無しさん
2020/03/03(火) 21:00:42.72ID:aQWPV0PM static TEST = &'static str = "test";
このTESTの文字列の最後の一文字だけを参照として&'static charで作ることってできる?
型レベルで一文字ってことを保証したいのとメモリ節約したい
このTESTの文字列の最後の一文字だけを参照として&'static charで作ることってできる?
型レベルで一文字ってことを保証したいのとメモリ節約したい
118デフォルトの名無しさん
2020/03/03(火) 21:53:23.53ID:NDXXif57 >>117
charは4byteで&strはutf-8でasciiの部分は1byteだから無理そう。
charは4byteで&strはutf-8でasciiの部分は1byteだから無理そう。
119デフォルトの名無しさん
2020/03/03(火) 22:01:05.88ID:Bj/i6Nw/ charは4バイトでポインタ(参照)は8バイトだから節約するどころかむしろメモリ食ってるなwww
120デフォルトの名無しさん
2020/03/03(火) 22:09:48.50ID:lzYVFoFM charにする場合は’staticは無理なんじゃないかな
&strをsliceして1文字分にしたほうが素直だと思う
let x: &'static str = "test";
let y: &'static str = &x[x.len()-1..];
let z: &char = &x.chars().next_back().unwrap();
&strをsliceして1文字分にしたほうが素直だと思う
let x: &'static str = "test";
let y: &'static str = &x[x.len()-1..];
let z: &char = &x.chars().next_back().unwrap();
121デフォルトの名無しさん
2020/03/03(火) 22:48:24.81ID:EQ8N775K そこまでメモリ節約したいって組込系か何かか
122デフォルトの名無しさん
2020/03/03(火) 23:11:15.82ID:VHyE3ijH charでなくu8を使うシーンに思える
123デフォルトの名無しさん
2020/03/03(火) 23:13:54.10ID:EQ8N775K asciiと分かってるなら u8 だよね
どっかで u8 ベースの文字列操作ライブラリ見かけた気がする
どっかで u8 ベースの文字列操作ライブラリ見かけた気がする
124デフォルトの名無しさん
2020/03/03(火) 23:14:25.42ID:YHPxp8LF125デフォルトの名無しさん
2020/03/03(火) 23:30:49.39ID:EQ8N775K126デフォルトの名無しさん
2020/03/04(水) 00:03:26.33ID:g8GJiSIM おお、いっぱい回答くれた ありがとう
レス止まってたけど見てる人はいるんだね。
素直にsliceしようと思ったけど、
str.chars.last()
このlastって消費されないけどなんで?
型的には
fn last(self) -> Option<char>
だけどなんで消費されないか分かんない
&strみたいな元々消費不可能ならコンパイルエラーでると思ってたんだけど。
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last
レス止まってたけど見てる人はいるんだね。
素直にsliceしようと思ったけど、
str.chars.last()
このlastって消費されないけどなんで?
型的には
fn last(self) -> Option<char>
だけどなんで消費されないか分かんない
&strみたいな元々消費不可能ならコンパイルエラーでると思ってたんだけど。
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last
127デフォルトの名無しさん
2020/03/04(水) 00:12:13.85ID:/mNi51EN 消費されるのは&strじゃなくてそのイテレータだからね。
"abcd".chars()で得られるのは、{ String : source, index : 0 }みたいな形のChars型で、これがindexをインクリメントしながら文字を取得してくれる。
"abcd".chars()で得られるのは、{ String : source, index : 0 }みたいな形のChars型で、これがindexをインクリメントしながら文字を取得してくれる。
128デフォルトの名無しさん
2020/03/05(木) 00:35:43.70ID:cMoNZaaE use std::fmt::{self, Display, Write};
このselfってどういう意味?
このselfってどういう意味?
129デフォルトの名無しさん
2020/03/05(木) 00:38:13.00ID:S5c20Dqb >>128
use std::fmt;と同じ。
use std::fmt;と同じ。
130デフォルトの名無しさん
2020/03/06(金) 00:28:35.73ID:s+8hbWLf まさにこの質問と同じ状況でコンパイル出来ないんですけど、分かる人いますか?
https://stackoverflow.com/questions/46393890/mutable-borrow-in-loop
https://stackoverflow.com/questions/46393890/mutable-borrow-in-loop
131デフォルトの名無しさん
2020/03/06(金) 01:12:13.19ID:n2xpzai7132デフォルトの名無しさん
2020/03/06(金) 19:38:23.62ID:s+8hbWLf133デフォルトの名無しさん
2020/03/06(金) 21:38:26.09ID:n2xpzai7 >>132
ある値に対するmutable referenceは同時には1つしか存在できない
ってのはRustの基本ルールの1つ
この場合は並列に回す可能性があるかどうかは関係ない
Test構造体自体のライフタイムが’aで
dostuff()が&’a mut selfを取るなら
1回目のdostuff()呼び出し時にselfをmutableに借りてくるけど
Test構造体のライフタイムと同じだけ借りることになるから
2回目のdostuff()呼び出し時には1個目を借りたまま2個目を借りようとしてることになる
だからエラー
ある値に対するmutable referenceは同時には1つしか存在できない
ってのはRustの基本ルールの1つ
この場合は並列に回す可能性があるかどうかは関係ない
Test構造体自体のライフタイムが’aで
dostuff()が&’a mut selfを取るなら
1回目のdostuff()呼び出し時にselfをmutableに借りてくるけど
Test構造体のライフタイムと同じだけ借りることになるから
2回目のdostuff()呼び出し時には1個目を借りたまま2個目を借りようとしてることになる
だからエラー
134デフォルトの名無しさん
2020/03/07(土) 13:13:11.28ID:e127m1PH135デフォルトの名無しさん
2020/03/08(日) 08:35:20.95ID:MryPyRvf >>134
どのライブラリのどのメソッド?
どのライブラリのどのメソッド?
136デフォルトの名無しさん
2020/03/08(日) 11:34:51.20ID:gavt1hh0 その構造体の意図が分からんので、あんまりアドバイスできない
単にライブラリ作者がrustに慣れていないだけなら、適切な形に直してもらうのがシンプルで合理的だし、
>>130のTest::fixme相当のメソッドは誰にも呼び出して欲しくないのかもしれないなら、使うべきじゃない
Test::dostuffを繰り返し呼び出したいだけならRefCellで何とかなる
単にライブラリ作者がrustに慣れていないだけなら、適切な形に直してもらうのがシンプルで合理的だし、
>>130のTest::fixme相当のメソッドは誰にも呼び出して欲しくないのかもしれないなら、使うべきじゃない
Test::dostuffを繰り返し呼び出したいだけならRefCellで何とかなる
137デフォルトの名無しさん
2020/03/08(日) 11:38:51.13ID:gavt1hh0 Rustで型パズルみたいな状況になるのは、見落としている前提があったり、設計レベルで何か考慮が足りないことが原因な事が多いと個人的には思ってる
姑息な解決をしてたら余計にドツボにはまる
姑息な解決をしてたら余計にドツボにはまる
138デフォルトの名無しさん
2020/03/09(月) 04:03:43.73ID:FXqsuorv >>135
>>136
このライブラリです。
https://github.com/fulmicoton/kuromoji-rs
https://github.com/fulmicoton/kuromoji-rs/blob/master/src/lib.rs#L246-L256
こういう風に使おうとしていて、Testと同じ状況です。
let mut tokenizer = kuromoji::Tokenizer::normal();
for s in ["Example", "Example2"].iter() {
tokenizer.tokenize_str(s);
}
>>136
このライブラリです。
https://github.com/fulmicoton/kuromoji-rs
https://github.com/fulmicoton/kuromoji-rs/blob/master/src/lib.rs#L246-L256
こういう風に使おうとしていて、Testと同じ状況です。
let mut tokenizer = kuromoji::Tokenizer::normal();
for s in ["Example", "Example2"].iter() {
tokenizer.tokenize_str(s);
}
139デフォルトの名無しさん
2020/03/09(月) 06:35:47.93ID:wpD0c2Sy >>138
Tokenizer自体は'aで定義されてないからTestとは状況違うんじゃない?
Tokenizer自体は'aで定義されてないからTestとは状況違うんじゃない?
140デフォルトの名無しさん
2020/03/09(月) 10:07:04.49ID:KfBbpF5w コンパイラをだましても本質的な解決にはならん。
そろそろrustマンセーしてる輩も気づくころだろうね。
そろそろrustマンセーしてる輩も気づくころだろうね。
141デフォルトの名無しさん
2020/03/09(月) 12:37:33.41ID:DOrcZre+ なんかトレイトの命名でなるべく名詞ではなく動詞を使う(WriterではなくWrite、ReaderではなくRead)みたいなのがオフィシャルの文書で有ったような気がするんだけど見つからない
そんな指針って無かったっけ?
そんな指針って無かったっけ?
142デフォルトの名無しさん
2020/03/09(月) 12:52:18.51ID:lyteAeVl >>141
オフィシャルにはapi-guidelinesだと思うけど特になさそう。
このissueで議論されてるけど特に結論はでてないし。
https://github.com/rust-lang/api-guidelines/issues/28
オフィシャルにはapi-guidelinesだと思うけど特になさそう。
このissueで議論されてるけど特に結論はでてないし。
https://github.com/rust-lang/api-guidelines/issues/28
143デフォルトの名無しさん
2020/03/09(月) 13:05:24.07ID:CscrLobz >>141
話し合いしている様子は見つけた。
https://github.com/rust-lang/api-guidelines/issues/28
どちらを優先するという話ではなく、使い分けがあるっぽい。
話し合いしている様子は見つけた。
https://github.com/rust-lang/api-guidelines/issues/28
どちらを優先するという話ではなく、使い分けがあるっぽい。
144デフォルトの名無しさん
2020/03/09(月) 21:11:10.09ID:tRF5zhFi 一年くらい前に挫折して最近また勉強し始めたんだけど参照周りの仕様変わった?
https://doc.rust-jp.rs/rust-by-example-ja/scope/borrow/freeze.html
これとかエラーにならないし
https://doc.rust-jp.rs/rust-by-example-ja/scope/borrow/freeze.html
これとかエラーにならないし
145デフォルトの名無しさん
2020/03/09(月) 21:47:20.13ID:oO+VEyrl >>144
昔は一度借用するとスコープアウトするまで借りっぱなしだったけど、今は使われなくなった時点で返すようになってる。
non lexical lifetimeというやつ。
英語版だとちゃんとエラーになるように修正されてるね。
https://doc.rust-lang.org/rust-by-example/scope/borrow/freeze.html
昔は一度借用するとスコープアウトするまで借りっぱなしだったけど、今は使われなくなった時点で返すようになってる。
non lexical lifetimeというやつ。
英語版だとちゃんとエラーになるように修正されてるね。
https://doc.rust-lang.org/rust-by-example/scope/borrow/freeze.html
146デフォルトの名無しさん
2020/03/09(月) 22:32:56.28ID:Wg77JZ2S >>138
試しに触ってみた感じだけど、戻り値をVecに格納しようとすると怒られるよね。
で、よく見ると引数のtextはtokenizer自身と全く関係の無い寿命であって良いのに、tokenizerとtextの寿命が同じであるってシグネチャで言ってるから何かマズそう
多分もっと理解できる人も居るだろうけど、selfとtextの寿命を無関係にしたら動くってなんとなく分かる
pub fn tokenize_str<'s, 'a>(&'s mut self, mut text: &'a str) -> Vec<&'a str> {
ってやったら動くよ。省略ルールで
pub fn tokenize_str<'a>(&mut self, mut text: &'a str) -> Vec<&'a str> {
と同義。
俺の頭の中の理解じゃプルリク送れるほど明快に説明できないが、適当にローカルに落とすかgithubでforkして使っても良い
試しに触ってみた感じだけど、戻り値をVecに格納しようとすると怒られるよね。
で、よく見ると引数のtextはtokenizer自身と全く関係の無い寿命であって良いのに、tokenizerとtextの寿命が同じであるってシグネチャで言ってるから何かマズそう
多分もっと理解できる人も居るだろうけど、selfとtextの寿命を無関係にしたら動くってなんとなく分かる
pub fn tokenize_str<'s, 'a>(&'s mut self, mut text: &'a str) -> Vec<&'a str> {
ってやったら動くよ。省略ルールで
pub fn tokenize_str<'a>(&mut self, mut text: &'a str) -> Vec<&'a str> {
と同義。
俺の頭の中の理解じゃプルリク送れるほど明快に説明できないが、適当にローカルに落とすかgithubでforkして使っても良い
147デフォルトの名無しさん
2020/03/09(月) 22:35:30.43ID:tRF5zhFi >>145
non lexical lifetimeっていうのね。Rust日本語情報が少ないので助かるわ。thx
non lexical lifetimeっていうのね。Rust日本語情報が少ないので助かるわ。thx
148デフォルトの名無しさん
2020/03/09(月) 23:22:38.75ID:hlMkZByK149デフォルトの名無しさん
2020/03/10(火) 15:02:44.20ID:eonxFH18 >>138
Linderaってのがkuromoji-rsの後継らしいからそっち使えば?
https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7
https://github.com/lindera-morphology/lindera
該当箇所のライフタイムは修正されてるのでtokenizerのインスタンスをループで使っても問題ない
https://docs.rs/lindera/0.3.4/src/lindera/tokenizer.rs.html#163-173
ただドキュメントは整備されてないし
ライブラリ自身のテストも通らない状態になってるから
本格的に使うなら自分でメンテするくらいの覚悟が必要かもしれん
Linderaってのがkuromoji-rsの後継らしいからそっち使えば?
https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7
https://github.com/lindera-morphology/lindera
該当箇所のライフタイムは修正されてるのでtokenizerのインスタンスをループで使っても問題ない
https://docs.rs/lindera/0.3.4/src/lindera/tokenizer.rs.html#163-173
ただドキュメントは整備されてないし
ライブラリ自身のテストも通らない状態になってるから
本格的に使うなら自分でメンテするくらいの覚悟が必要かもしれん
150デフォルトの名無しさん
2020/03/10(火) 19:42:21.39ID:jwXWuMzy >>149
ありがとうございます、後継なんてあったんですね。
最近出来たみたいですがそれほどメンテされてないみたいですしこの先不安なので素直にPython使うことにします。
日本関係依存のライブラリはRustユーザー少ないので確立されたものがないのが辛いですね...
ありがとうございます、後継なんてあったんですね。
最近出来たみたいですがそれほどメンテされてないみたいですしこの先不安なので素直にPython使うことにします。
日本関係依存のライブラリはRustユーザー少ないので確立されたものがないのが辛いですね...
151デフォルトの名無しさん
2020/03/10(火) 19:58:15.03ID:uPXabSQ0 rustも字句解析も相当知ってなきゃそれ使うの無理だろ。。
152デフォルトの名無しさん
2020/03/11(水) 18:46:16.77ID:TDIek7NK vecのinto_iter呼んだらconsumeするって
fn into_iter(self) -> イテレータ {self}
こういうふうになってるってこと?
よく分かってない質問ですみません。
fn into_iter(self) -> イテレータ {self}
こういうふうになってるってこと?
よく分かってない質問ですみません。
153デフォルトの名無しさん
2020/03/11(水) 18:56:11.75ID:TDIek7NK あ、consumeじゃないわこの場合
moveって言いたかった
moveって言いたかった
154デフォルトの名無しさん
2020/03/11(水) 19:43:34.97ID:TDIek7NK 自己解決?
https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-IntoIterator
impl<T> IntoIterator for Vec<T>
こうなってるからそのまま self を返してるに違いない
よーわからんけどなんとなく納得
https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-IntoIterator
impl<T> IntoIterator for Vec<T>
こうなってるからそのまま self を返してるに違いない
よーわからんけどなんとなく納得
155デフォルトの名無しさん
2020/03/11(水) 19:46:02.45ID:vu1i9ieU よく分からないのに納得してしまうのはよくない
156デフォルトの名無しさん
2020/03/11(水) 20:15:44.69ID:aaR0sYBN >>154
ソースで理解したいんならここ。
https://doc.rust-lang.org/src/alloc/vec.rs.html#1934-1952
Vecのポインタを使ってIntoIterを構築して、元のVecはforgetでメモリ管理対象から外してる。
ソースで理解したいんならここ。
https://doc.rust-lang.org/src/alloc/vec.rs.html#1934-1952
Vecのポインタを使ってIntoIterを構築して、元のVecはforgetでメモリ管理対象から外してる。
157デフォルトの名無しさん
2020/03/11(水) 20:40:35.00ID:TDIek7NK >>155 おっしゃるとおり
>>156 おおおお!!!
想像とは違ってunsafeの中であれこれしてた!
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> {
unsafe {
let begin = self.as_mut_ptr();
let end = if mem::size_of::<T>() == 0 {
arith_offset(begin as *const i8, self.len() as isize) as *const T
} else {
begin.add(self.len()) as *const T
};
let cap = self.buf.capacity();
mem::forget(self);
IntoIter {
buf: NonNull::new_unchecked(begin),
phantom: PhantomData,
cap,
ptr: begin,
end,
}
}
}
}
いやあ勉強になります
>>156 おおおお!!!
想像とは違ってunsafeの中であれこれしてた!
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> {
unsafe {
let begin = self.as_mut_ptr();
let end = if mem::size_of::<T>() == 0 {
arith_offset(begin as *const i8, self.len() as isize) as *const T
} else {
begin.add(self.len()) as *const T
};
let cap = self.buf.capacity();
mem::forget(self);
IntoIter {
buf: NonNull::new_unchecked(begin),
phantom: PhantomData,
cap,
ptr: begin,
end,
}
}
}
}
いやあ勉強になります
158デフォルトの名無しさん
2020/03/11(水) 22:03:42.73ID:JP1MFGqI fn into_iter(mut self) -> IntoIter<T>
このmut selfのmutの使い方について
意味は理解してるんだけど公式で解説してる箇所ある?
このmut selfのmutの使い方について
意味は理解してるんだけど公式で解説してる箇所ある?
159デフォルトの名無しさん
2020/03/11(水) 22:44:26.55ID:PgaAGaoo なんでextern crate crate_name;ってuse crate_name;に統合されたの?
160デフォルトの名無しさん
2020/03/11(水) 23:04:39.68ID:JP1MFGqI161デフォルトの名無しさん
2020/03/12(木) 06:53:02.39ID:/EHADneN serde, reqwestとかを使ってるだけの小さいツールなのに
targetディレクトリ以下がいつの間にか2GB以上喰ってて驚いた
無駄遣いしすぎだろ
targetディレクトリ以下がいつの間にか2GB以上喰ってて驚いた
無駄遣いしすぎだろ
162デフォルトの名無しさん
2020/03/12(木) 09:00:30.33ID:TSUJe0Rk ぜろこすとおーばーへっど(笑)
163デフォルトの名無しさん
2020/03/12(木) 09:20:01.92ID:mBaP1v85164デフォルトの名無しさん
2020/03/13(金) 01:08:14.21ID:Guh/z+Wu 容量くうのってインクリメンタルコンパイルのせいかしら?
165デフォルトの名無しさん
2020/03/13(金) 16:12:49.45ID:uMGbn/tA cargo run --bin bin_a で bin_a から a にバイナリ名をrenameできる方法ない?
オプションとかで
オプションとかで
166デフォルトの名無しさん
2020/03/13(金) 17:20:18.20ID:1gFsIjGl167デフォルトの名無しさん
2020/03/13(金) 17:48:43.18ID:uMGbn/tA >>164
インクリメンタルコンパイルの内部構造知らないけど、仕組み的に一個前の状態しかもたないから関係なさそう
インクリメンタルコンパイルの内部構造知らないけど、仕組み的に一個前の状態しかもたないから関係なさそう
168デフォルトの名無しさん
2020/03/13(金) 20:50:49.12ID:WvGu/USG お前らのtargetディレクトリは何GBあるんだ?
169デフォルトの名無しさん
2020/03/13(金) 21:21:22.50ID:1gFsIjGl duとかdustでどのcrateが容量食ってるのか
きちんと確認したほうがいい
きちんと確認したほうがいい
170デフォルトの名無しさん
2020/03/13(金) 22:52:16.46ID:xYdxtME8 dustで一番ディスク喰ってるプロジェクトを調べてみたよ
target/debug/depsの下に
lib(serde|derive_more|syn|reqwest|chrono_tz)-xxxxxxx.(so|rlib)
が各ライブラリごとに3つずつぐらいあって、それぞれ21〜38MBぐらいあった
その他、依存ライブラリの依存ライブラリと思われる *.rlib ファイルが260個
これだけで 1.4GB
target/debug/build の下が400MBぐらい
target/debug/incremental の下は100MBもない
同様のファイルがtarget/releaseにもあって合わせると 2.3GB
target/debug/depsの下に
lib(serde|derive_more|syn|reqwest|chrono_tz)-xxxxxxx.(so|rlib)
が各ライブラリごとに3つずつぐらいあって、それぞれ21〜38MBぐらいあった
その他、依存ライブラリの依存ライブラリと思われる *.rlib ファイルが260個
これだけで 1.4GB
target/debug/build の下が400MBぐらい
target/debug/incremental の下は100MBもない
同様のファイルがtarget/releaseにもあって合わせると 2.3GB
171デフォルトの名無しさん
2020/03/14(土) 01:08:40.11ID:7CRfyKLY エコシステムが充実してるのはいいが、
ぞろぞろと依存を引き連れて落ちてくるのはしんどいな。
ぞろぞろと依存を引き連れて落ちてくるのはしんどいな。
172デフォルトの名無しさん
2020/03/14(土) 09:57:16.83ID:C6o8FCtt う、うん…
173デフォルトの名無しさん
2020/03/14(土) 13:30:22.96ID:Bfptd6Kx Rustに限らず誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がダウンロードされるかも知らないままインストールするのが当たり前になっちゃってるよな
ソースが公開されてるとは言えこれじゃいかんよなぁとは思いつつ楽だからまぁいっかな…って感じだわ(´・ω・`)
ソースが公開されてるとは言えこれじゃいかんよなぁとは思いつつ楽だからまぁいっかな…って感じだわ(´・ω・`)
174デフォルトの名無しさん
2020/03/14(土) 13:52:26.42ID:C6o8FCtt わからないまま終わる。そんなのは嫌だ(´・ω・`)
175デフォルトの名無しさん
2020/03/14(土) 13:58:57.65ID:fsLvYgsF 実際なんかの言語で問題起こしていたような
176デフォルトの名無しさん
2020/03/14(土) 14:53:10.70ID:XTUayws2 node.js
177デフォルトの名無しさん
2020/03/14(土) 15:14:32.21ID:kPfIlYV/ 誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がインストールされるかも知らないままOSをインストールするのが当たり前になっちゃってるよな
178デフォルトの名無しさん
2020/03/15(日) 11:00:03.22ID:OT/9HDtv 公式アプリストアしか使えないとか真逆の動きだろ
何指してるんだ?
何指してるんだ?
179デフォルトの名無しさん
2020/03/15(日) 12:03:48.31ID:WbKVgqmu 実際のところ、そんなのいちいち精査してられんだろう。
180デフォルトの名無しさん
2020/03/16(月) 23:59:03.20ID:krhm4ltp arrayvecとsmallvecってどっち使えばいいの?
181デフォルトの名無しさん
2020/03/17(火) 04:52:34.09ID:fexMQ7hH 好きな方。
182デフォルトの名無しさん
2020/03/17(火) 10:23:26.40ID:6zUWJLLj arrayvecとsmallvecよく見てないけど同じぐらい人気だからどっちでもよさそう
それよりもロガー周りが何選んだらいいか分からん(env_logger抜きで)
ファイル保存したいからlog4rsかfernかslogで迷ってる
ライブラリ選びはホントにRustの欠点だよな
それよりもロガー周りが何選んだらいいか分からん(env_logger抜きで)
ファイル保存したいからlog4rsかfernかslogで迷ってる
ライブラリ選びはホントにRustの欠点だよな
183デフォルトの名無しさん
2020/03/17(火) 11:06:35.06ID:fexMQ7hH まあねぇ。 部品は連携してこそのものだから、
どっちでもいいものでもどちらかには決まってた方がありがたいってのはあるわな。
自由の強さと統率の強さは両立できないのでしゃーない。
どっちでもいいものでもどちらかには決まってた方がありがたいってのはあるわな。
自由の強さと統率の強さは両立できないのでしゃーない。
184デフォルトの名無しさん
2020/03/17(火) 11:30:02.19ID:0EWfgnGX 確かに選びにくいんだけど、型が強いのとコンパイルエラーが見やすいから、移行コストが結構低い気はしている。
なので最近はあまり気にせず適当に選ぶことにしてるな。
なので最近はあまり気にせず適当に選ぶことにしてるな。
185デフォルトの名無しさん
2020/03/17(火) 13:15:29.64ID:4299LfVU スタック上に確保するStringライブラリってあるの?
186デフォルトの名無しさん
2020/03/17(火) 17:38:45.49ID:7aqG0pP2 rust-avって今どういう状況なん?
だいぶ前にlibavの人たちがMozillaから数万ドル支援を受けて始めたとかニュースになってたけどgithub見ても実質的にはほぼ何も進んでないようなコミットばっかだしlibavすらほぼ放置みたいな感じだし
非公開の場所で着々と進んでてそのうち公開されるんやろか
だいぶ前にlibavの人たちがMozillaから数万ドル支援を受けて始めたとかニュースになってたけどgithub見ても実質的にはほぼ何も進んでないようなコミットばっかだしlibavすらほぼ放置みたいな感じだし
非公開の場所で着々と進んでてそのうち公開されるんやろか
187デフォルトの名無しさん
2020/03/18(水) 05:43:30.43ID:1FpZgrTM C++の負の仕様引きずってるなってRustの特徴とかある?
188デフォルトの名無しさん
2020/03/18(水) 09:41:00.53ID:0NsruLdQ C++の負の仕様って何?
189デフォルトの名無しさん
2020/03/18(水) 21:47:04.33ID:ygvPU+jd winapi 0.3.8 の環境にて、CoCreateInstanceを行いたいのですが、
REFIIDの指定部分をどのように書けばよいか教えてくださいませ
REFIIDの指定部分をどのように書けばよいか教えてくださいませ
190デフォルトの名無しさん
2020/03/19(木) 00:16:54.84ID:i16Q86hT なんでassert_neはあるけどassert_notはないの?
191デフォルトの名無しさん
2020/03/19(木) 01:43:10.57ID:2ajU8oVE notと!が続いて少し紛らわしい
なくてもそんな困らない
必要なら作ればいい
とかかな
macro_rules! assert_not {
($cond:expr) => { assert!(!$cond) };
($cond:expr,) => { assert!(!$cond) };
($cond:expr, $($arg:tt)+) => { assert!(!$cond, $($arg)*) };
}
なくてもそんな困らない
必要なら作ればいい
とかかな
macro_rules! assert_not {
($cond:expr) => { assert!(!$cond) };
($cond:expr,) => { assert!(!$cond) };
($cond:expr, $($arg:tt)+) => { assert!(!$cond, $($arg)*) };
}
192デフォルトの名無しさん
2020/03/19(木) 15:19:47.59ID:dnKvjYNt assert!(!false);
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
193デフォルトの名無しさん
2020/03/20(金) 07:03:37.86ID:6UN4nNu/ usize同士の差の絶対値を求めるのがすごくだるいんですけどなんかいい方法ないすか
194デフォルトの名無しさん
2020/03/20(金) 07:38:59.81ID:4VHKiEg+ if x > y { x - y } else { y - x }
じゃ駄目かい
じゃ駄目かい
195デフォルトの名無しさん
2020/03/20(金) 08:14:22.57ID:6UN4nNu/ やっぱそうするしか?
196デフォルトの名無しさん
2020/03/20(金) 16:54:06.07ID:ShTr86MM そういう関数を作っておけばええやん。
197デフォルトの名無しさん
2020/03/21(土) 19:08:12.84ID:d5Yv109I let mut v = vec![1,2];
std::mem::swap(v[1], v[0]);
assert!(v == vec![2,1]);
こうしたいんですけど、どうすればいいですか?
std::mem::swap(v[1], v[0]);
assert!(v == vec![2,1]);
こうしたいんですけど、どうすればいいですか?
198デフォルトの名無しさん
2020/03/21(土) 19:19:05.58ID:HIaSqchS Vec::swap使え->
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね
ってやりたい荒らしだろ?
氏ねばいいと思うよ
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね
ってやりたい荒らしだろ?
氏ねばいいと思うよ
199デフォルトの名無しさん
2020/03/21(土) 19:32:13.45ID:g81eKbe5 標準ライブラリ内でunsafe使うのと
自前でunsafe使わされるのとは雲泥の差があると思うんだがw
自前でunsafe使わされるのとは雲泥の差があると思うんだがw
200デフォルトの名無しさん
2020/03/21(土) 20:27:19.94ID:d5Yv109I ヤクザかな?
201デフォルトの名無しさん
2020/03/21(土) 20:38:04.64ID:HIaSqchS ほら、万が一の荒らしじゃないケース用に答えも同時に提示してあげたのにそっちには見向きもしないでしょ
そりゃそうだよね、実際はやりたいことの質問じゃなくてRustをディスるための質問なんだもんね
つかそもそも本当に質問のことがやりたいなら提示したコードをコンパイルしようとしてるはずだよね
そしたら親切なコンパイラが&mutで借用しろって教えてくれてるよね
そしたらそれに従ったら今度は親切なコンパイラが同時に2つmutな借用は作れないって教えてくれてるよね
じゃあどうしたら良いですか?ってなるのが普通だよね
それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
そりゃそうだよね、実際はやりたいことの質問じゃなくてRustをディスるための質問なんだもんね
つかそもそも本当に質問のことがやりたいなら提示したコードをコンパイルしようとしてるはずだよね
そしたら親切なコンパイラが&mutで借用しろって教えてくれてるよね
そしたらそれに従ったら今度は親切なコンパイラが同時に2つmutな借用は作れないって教えてくれてるよね
じゃあどうしたら良いですか?ってなるのが普通だよね
それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
202デフォルトの名無しさん
2020/03/22(日) 13:10:01.70ID:HvrypJyW Rustにも、次のような「言語定義された smart pointer」があり、
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
203デフォルトの名無しさん
2020/03/22(日) 14:01:25.52ID:HvrypJyW >>202
参照カウンタを1引くようなDeref や、C/C++の単項演算子の方の「*」と
全く同様な「参照はずし演算子」の「*」もあるようですね。
また、~ や @ よりは少し高レベルになった smart pointer として、
Box<T> が、参照カウンタ方式の smart pointer として Rc<T> が、
さらに、動的(?)になった smart pointer としてRef<T>やRefMut<T>
があるようです。
凄く複雑です。
参照カウンタを1引くようなDeref や、C/C++の単項演算子の方の「*」と
全く同様な「参照はずし演算子」の「*」もあるようですね。
また、~ や @ よりは少し高レベルになった smart pointer として、
Box<T> が、参照カウンタ方式の smart pointer として Rc<T> が、
さらに、動的(?)になった smart pointer としてRef<T>やRefMut<T>
があるようです。
凄く複雑です。
204デフォルトの名無しさん
2020/03/22(日) 14:28:20.92ID:HvrypJyW 参照型の変数 r への代入は、普段は、
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
205デフォルトの名無しさん
2020/03/22(日) 15:43:22.86ID:thEQOCMJ 6年以上前に削除された仕様の良し悪しを語りたいのか?
206デフォルトの名無しさん
2020/03/22(日) 15:57:03.70ID:DNfY/SCe rustの未来教えて
207デフォルトの名無しさん
2020/03/22(日) 16:08:02.82ID:HvrypJyW >>205
詳しくお願いします。
詳しくお願いします。
208デフォルトの名無しさん
2020/03/22(日) 16:50:19.83ID:thEQOCMJ >>207 いやbook読んでよ。もし@とか~についての記述があったら逆に教えて欲しいくらいだ
209デフォルトの名無しさん
2020/03/22(日) 17:28:44.77ID:HvrypJyW >>204
&と*は常に逆の関係にあるようです。
The opposite of referencing by using & is dereferencing, which is accomplished with the dereference operator, *.
vがvecへの参照型の場合でも
v.push(5);
と書けてしまうのは、実体vとポインタ pV に対して
v.push(5);
pV->push(5);
と区別していたC++と違っているために個人的に混乱していただけのようです。
もう一つは、参照ではなく、
let a = 5;
let a = a + 1;
のように shadowing を行う例が個人的に混乱の原因になっていたようです。
参照型 &T の場合には、
let r : &mut TYPE = &a;
のようにした後は、
*r = xxx;
のように、原則的に * を付けて参照を一段階戻す必要があるようです。
*をつけなくていいのは、メンバ関数呼び出しの、
r.func();
のような例の場合だけで、もしかすると、
(*r).func();
としてもコンパイルが通るかもしれません。
&と*は常に逆の関係にあるようです。
The opposite of referencing by using & is dereferencing, which is accomplished with the dereference operator, *.
vがvecへの参照型の場合でも
v.push(5);
と書けてしまうのは、実体vとポインタ pV に対して
v.push(5);
pV->push(5);
と区別していたC++と違っているために個人的に混乱していただけのようです。
もう一つは、参照ではなく、
let a = 5;
let a = a + 1;
のように shadowing を行う例が個人的に混乱の原因になっていたようです。
参照型 &T の場合には、
let r : &mut TYPE = &a;
のようにした後は、
*r = xxx;
のように、原則的に * を付けて参照を一段階戻す必要があるようです。
*をつけなくていいのは、メンバ関数呼び出しの、
r.func();
のような例の場合だけで、もしかすると、
(*r).func();
としてもコンパイルが通るかもしれません。
210デフォルトの名無しさん
2020/03/22(日) 17:30:53.65ID:HvrypJyW >>208
https://pcwalton.github.io/2013/03/18/an-overview-of-memory-management-in-rust.html
Rust の 2種のスマートポインター、^ と @ に詳しいです。
「book」と言えば、詳しく学ぶには、まさに
https://doc.rust-lang.org/book/index.html
が初心者には分かり易いようです。
この本のことでしょうか?
https://pcwalton.github.io/2013/03/18/an-overview-of-memory-management-in-rust.html
Rust の 2種のスマートポインター、^ と @ に詳しいです。
「book」と言えば、詳しく学ぶには、まさに
https://doc.rust-lang.org/book/index.html
が初心者には分かり易いようです。
この本のことでしょうか?
211デフォルトの名無しさん
2020/03/22(日) 17:52:06.65ID:qATPJDe3 7年も前の情報を無条件に信じられるピュアさが俺にも欲しいよ
212デフォルトの名無しさん
2020/03/22(日) 17:52:35.28ID:ufFd2vaY213デフォルトの名無しさん
2020/03/22(日) 18:32:23.24ID:DNfY/SCe 初心者なんだけど
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
214デフォルトの名無しさん
2020/03/22(日) 18:40:28.26ID:DNfY/SCe あまちがえました
訂正:
複数のミュータブルな参照を作る事になります
訂正:
複数のミュータブルな参照を作る事になります
215デフォルトの名無しさん
2020/03/22(日) 18:53:15.15ID:I5Su+SV6216デフォルトの名無しさん
2020/03/22(日) 19:02:35.81ID:DNfY/SCe 実行時にデータ競合系の問題が生じない代わりに
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
217デフォルトの名無しさん
2020/03/22(日) 19:17:35.15ID:thEQOCMJ >>210 そのbookだよ。オフィシャルのドキュメントを読まずにどうして深入りできようか
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
218デフォルトの名無しさん
2020/03/23(月) 01:35:58.42ID:bf1cRh+B219デフォルトの名無しさん
2020/03/23(月) 01:39:22.78ID:h1jHr6GN 所有権、借用、ライフタイムについて勉強してみた。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
220デフォルトの名無しさん
2020/03/23(月) 02:29:29.77ID:bf1cRh+B Rustの変数束縛、所有権、借用などで自動化されるのは、
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
221デフォルトの名無しさん
2020/03/23(月) 02:39:09.37ID:bf1cRh+B >>220
例えば、Cだと、
int *func()
{
int a;
return &a;
}
としても警告は出る可能性はあってもコンパイルエラーにはなりませんが、
Rustでは同等のことはできないようになっていますね。
でも、Heapから確保したオブジェクトは、それを参照している変数の個数は
動的に変わります。というのは、Heapとは解放のタイミングを後に遅らせる
ための仕組みな分けですから。
オブジェクトを参照している変数の個数は静的に決まらないと言うことは、
参照カウンタやGarbageCollectionのような動的な検査の仕組みが全く無ければ
解放できないはずですね。
もし静的に解放タイミングを決められる可能性があるとすれば、参照の個数に上限を
設けることによってです。簡単な例ではそのオブジェクトを参照する変数が1つしか
ないなら、その変数にnullや別の値が代入されたり、その変数が削除されるタイミング
だけを静的に調べれば自動解放できるはずです。
しかし、2つ以上になった場合、参照カウンタ無しで静的に削除タイミングを決定するのは
かなり難しくなります。
例えば、Cだと、
int *func()
{
int a;
return &a;
}
としても警告は出る可能性はあってもコンパイルエラーにはなりませんが、
Rustでは同等のことはできないようになっていますね。
でも、Heapから確保したオブジェクトは、それを参照している変数の個数は
動的に変わります。というのは、Heapとは解放のタイミングを後に遅らせる
ための仕組みな分けですから。
オブジェクトを参照している変数の個数は静的に決まらないと言うことは、
参照カウンタやGarbageCollectionのような動的な検査の仕組みが全く無ければ
解放できないはずですね。
もし静的に解放タイミングを決められる可能性があるとすれば、参照の個数に上限を
設けることによってです。簡単な例ではそのオブジェクトを参照する変数が1つしか
ないなら、その変数にnullや別の値が代入されたり、その変数が削除されるタイミング
だけを静的に調べれば自動解放できるはずです。
しかし、2つ以上になった場合、参照カウンタ無しで静的に削除タイミングを決定するのは
かなり難しくなります。
222デフォルトの名無しさん
2020/03/23(月) 03:10:34.91ID:h1jHr6GN 私が読んだ説明記事では所有権やライフタイムはローカル変数かつシングルスレッドの例しかなかったんですが、
それだとRustがどう非同期処理に強いのかイメージできませんでした。
グローバル変数やマルチスレッドでライフタイム等の概念が活用されている例ないですか?
それだとRustがどう非同期処理に強いのかイメージできませんでした。
グローバル変数やマルチスレッドでライフタイム等の概念が活用されている例ないですか?
223デフォルトの名無しさん
2020/03/23(月) 06:41:08.54ID:jGS2rL5b Rust では所有権が移るから、資源を共有しないからだろ
資源を共有すると、アクセスするタイミングで、バグってしまう。
A を更新 → B を更新 → Aを読み取り
間に、Bが入ったことで、AはBの値を読み取ってしまったけど、
その場ではエラーにならず、かなり後になって、データが何かおかしいと誰かが気づくかも知れない。
気づかないかも知れない
だから、あちこちで排他制御をせざるを得ない。
そうすると、デッドロック・タイムアウトも考えないといけない
資源を共有すると、アクセスするタイミングで、バグってしまう。
A を更新 → B を更新 → Aを読み取り
間に、Bが入ったことで、AはBの値を読み取ってしまったけど、
その場ではエラーにならず、かなり後になって、データが何かおかしいと誰かが気づくかも知れない。
気づかないかも知れない
だから、あちこちで排他制御をせざるを得ない。
そうすると、デッドロック・タイムアウトも考えないといけない
224デフォルトの名無しさん
2020/03/23(月) 09:52:06.45ID:9RbShf99 資源を共有しないんじゃなくて、共有していい資源かどうかを型(SendとSync)で区別している。
なので排他制御が必要な箇所に入ってなかったらコンパイルエラーにできる。
だからデッドロックなんかは起きるけど、レーシングは起きないって感じ。
ライフタイムはそれほど関係ない。
なので排他制御が必要な箇所に入ってなかったらコンパイルエラーにできる。
だからデッドロックなんかは起きるけど、レーシングは起きないって感じ。
ライフタイムはそれほど関係ない。
225デフォルトの名無しさん
2020/03/23(月) 12:20:19.11ID:bf1cRh+B マルチスレッドの話は置いておいて、そもそも Rustでは、Heapから確保したオブジェクトの解放は自動化されてますか?
226223
2020/03/23(月) 12:54:01.89ID:jGS2rL5b227デフォルトの名無しさん
2020/03/23(月) 13:43:29.57ID:xOZDOjnM 基本的なことが理解出来てない人はまずThe Bookを読もう
次からテンプレに書いといたほうが良さそう
次からテンプレに書いといたほうが良さそう
228デフォルトの名無しさん
2020/03/23(月) 15:20:59.29ID:bf1cRh+B 読んでそこまでたどりつくのは大変過ぎますので、どなたか分かる方が >>225 に答えていただければ幸いです。
229デフォルトの名無しさん
2020/03/23(月) 15:33:10.24ID:iGWxNb08 >>225
自動で解放される。なぜされるのかが気になるならいろいろ想像してないでthe bookを読んだ方がいいと思う。
自動で解放される。なぜされるのかが気になるならいろいろ想像してないでthe bookを読んだ方がいいと思う。
230デフォルトの名無しさん
2020/03/23(月) 15:33:45.55ID:3KZHweI3 贅沢は敵です。
231デフォルトの名無しさん
2020/03/23(月) 15:38:31.12ID:bf1cRh+B Rc<T> は参照カウンタ方式で自動解放されますが、循環参照があった場合には自動解放されず、メモリーリークするそうです。
つまり、RustはHeapのメモリーを完全自動では解放できないのです。
C#やJavaは遅いですが、循環参照がある場合でも、GarbageCollectionにより完全自動で解放されます。
つまり、RustはHeapのメモリーを完全自動では解放できないのです。
C#やJavaは遅いですが、循環参照がある場合でも、GarbageCollectionにより完全自動で解放されます。
232デフォルトの名無しさん
2020/03/23(月) 15:39:33.51ID:bf1cRh+B つまり、「Rustは、GarbageCollectionがなくてもメモリ解放が自動化されている」
というのは嘘です。
というのは嘘です。
233デフォルトの名無しさん
2020/03/23(月) 15:40:41.93ID:FLdc410A234デフォルトの名無しさん
2020/03/23(月) 15:41:06.82ID:bf1cRh+B >>231
https://stackoverflow.com/questions/55553048/is-it-possible-to-cause-a-memory-leak-in-rust
[Q] Is it possible to cause a memory leak in Rust?
Is there any way of causing a memory leak in Rust? I know that even in garbage-collected
languages like JavaScript there are edge-cases where memory will be leaked, are
there any such cases in Rust?
[A1]
Yes, leaking memory in Rust is as easy as calling the std::mem::forget function.
You can also leak memory if you create a cycle of shared references:
A cycle between Rc pointers will never be deallocated. For this reason, Weak is used to break cycles.
For example, a tree could have strong Rc pointers from parent nodes to children, and Weak pointers
from children back to their parents.
https://stackoverflow.com/questions/55553048/is-it-possible-to-cause-a-memory-leak-in-rust
[Q] Is it possible to cause a memory leak in Rust?
Is there any way of causing a memory leak in Rust? I know that even in garbage-collected
languages like JavaScript there are edge-cases where memory will be leaked, are
there any such cases in Rust?
[A1]
Yes, leaking memory in Rust is as easy as calling the std::mem::forget function.
You can also leak memory if you create a cycle of shared references:
A cycle between Rc pointers will never be deallocated. For this reason, Weak is used to break cycles.
For example, a tree could have strong Rc pointers from parent nodes to children, and Weak pointers
from children back to their parents.
235デフォルトの名無しさん
2020/03/23(月) 15:45:50.08ID:bf1cRh+B >>233
結論的に言えば、Heapから確保されたオブジェクトのメモリの解放は自動化されてません。
結論的に言えば、Heapから確保されたオブジェクトのメモリの解放は自動化されてません。
236デフォルトの名無しさん
2020/03/23(月) 15:49:21.93ID:iGWxNb08 なんだ。真面目に聞いてるのかと思ったのに。
まぁご自由にどうぞ。
まぁご自由にどうぞ。
237デフォルトの名無しさん
2020/03/23(月) 16:15:56.91ID:bf1cRh+B >>236
実際に自動化されていませんよね。
実際に自動化されていませんよね。
238デフォルトの名無しさん
2020/03/23(月) 16:28:50.38ID:rbTK8rb1 真面目に回答した相手が荒らしだった時って「何だよ荒らしかよ」みたいな反応より「クッソ抜けるwww」からの「すいません誤爆しました」みたいなレスで「真面目に回答したわけじゃないぞ、シコりながら適当に回答したんだぞ」的な雰囲気を出してったほうが良さそうじゃない?
239デフォルトの名無しさん
2020/03/23(月) 16:58:35.58ID:bf1cRh+B Rc<T> だけを使って循環リストを作った場合、循環参照が生じます。
その場合、その循環リスト全体が誰からも参照されなくなって、つまり、不要に
なっても「循環参照問題」が起きるために自動解放できないのです。
C#やJavaでは、この循環参照問題を解決することを主目的として、
遅さを犠牲に Garbage Collection を使っています。
これは「動的解析」に分類されます。
一方、Rustの場合は静的解析だけで済まそうとしていますが、結局、循環参照問題のために
完全自動化は出来ず、解放べきメモリが解放されずに残ってしまうという現象がおきえます。
これを防ぐには、人間側が 循環リストの最後と最初を結ぶためには、weak pointer を使う
などの注意深いプログラミングをすることで防ぐしかありません。
つまり、人間の注意深さでメモリーリークを防いでいるだけです。
その場合、その循環リスト全体が誰からも参照されなくなって、つまり、不要に
なっても「循環参照問題」が起きるために自動解放できないのです。
C#やJavaでは、この循環参照問題を解決することを主目的として、
遅さを犠牲に Garbage Collection を使っています。
これは「動的解析」に分類されます。
一方、Rustの場合は静的解析だけで済まそうとしていますが、結局、循環参照問題のために
完全自動化は出来ず、解放べきメモリが解放されずに残ってしまうという現象がおきえます。
これを防ぐには、人間側が 循環リストの最後と最初を結ぶためには、weak pointer を使う
などの注意深いプログラミングをすることで防ぐしかありません。
つまり、人間の注意深さでメモリーリークを防いでいるだけです。
240デフォルトの名無しさん
2020/03/23(月) 17:09:05.71ID:IXWRbkqI 都合の悪いことには誰も答えません。
241デフォルトの名無しさん
2020/03/23(月) 17:35:19.10ID:FLdc410A >>239
リークしない保証が欲しいならそういう言語 (処理系) を使えばいいじゃん。
Rust はリークを確実に排除することを保証しないし、
Rust の定義するメモリ安全にはリークの排除が含まれないことは明言されている。
https://doc.rust-lang.org/book/ch15-06-reference-cycles.html
GC を使えばメモリリークが起きないってわけでもないし、
「どのような保証を与えるか?」の線引きが違うだけで
きちんと学んできちんと使いこなさなきゃなんだって駄目だよ。
リークしない保証が欲しいならそういう言語 (処理系) を使えばいいじゃん。
Rust はリークを確実に排除することを保証しないし、
Rust の定義するメモリ安全にはリークの排除が含まれないことは明言されている。
https://doc.rust-lang.org/book/ch15-06-reference-cycles.html
GC を使えばメモリリークが起きないってわけでもないし、
「どのような保証を与えるか?」の線引きが違うだけで
きちんと学んできちんと使いこなさなきゃなんだって駄目だよ。
242デフォルトの名無しさん
2020/03/23(月) 18:36:24.14ID:bf1cRh+B243デフォルトの名無しさん
2020/03/23(月) 18:54:37.87ID:+m59DBar そりゃ循環参照とかウンコード書けばの話だろ、何か問題有るのか?
244デフォルトの名無しさん
2020/03/23(月) 18:56:19.36ID:y/3c+R5y Heap=Rcだと勘違いしてんのかな?
245デフォルトの名無しさん
2020/03/23(月) 19:00:04.36ID:iyDg9ARV 荒らしにかまうやつも荒らし
暇なおじいさんが各言語に難癖つけて回ってる
Kotlinの次はRust
暇なおじいさんが各言語に難癖つけて回ってる
Kotlinの次はRust
246デフォルトの名無しさん
2020/03/23(月) 19:15:41.65ID:cjB95B7K おかしな奴に絡まれるからRustはダメ言語
247デフォルトの名無しさん
2020/03/23(月) 19:16:56.45ID:FLdc410A >>242
結局のところライフタイムは人間が書くし、それを元にいくらかのチェックと推論をするだけ。
今まで自動化できてなかった分 (の一部) を新しいやり方で自動化したってだけのことで、
何もかも自動でやってくれるような最強解析能力を持ってるなんて誰も言ってないよ。
ストローマン論法はやめろよな。
もう一度書くけど、 Rust のシステムはメモリリークの排除を目的にしていない。
結局のところライフタイムは人間が書くし、それを元にいくらかのチェックと推論をするだけ。
今まで自動化できてなかった分 (の一部) を新しいやり方で自動化したってだけのことで、
何もかも自動でやってくれるような最強解析能力を持ってるなんて誰も言ってないよ。
ストローマン論法はやめろよな。
もう一度書くけど、 Rust のシステムはメモリリークの排除を目的にしていない。
248デフォルトの名無しさん
2020/03/23(月) 20:19:04.31ID:kJWIzarl 藁人形クッソ抜ける?
249デフォルトの名無しさん
2020/03/23(月) 21:49:49.89ID:urYmb4Ir リソースの開放をプログラム内で完璧にやろうとせずに
プロセスの再起動とかの水準で考えてしまえばいいこともあるかもね
プロセスの再起動とかの水準で考えてしまえばいいこともあるかもね
250デフォルトの名無しさん
2020/03/23(月) 22:15:27.45ID:0TZC4jF8 メモリ以外のリソース回収に関してはGCよりRust(あるいはC++のスマポ)がはるかに優秀なんだよな。
Rustに慣れると他言語でusingとかするのが面倒になってくるし、ついつい付け忘れて困る。
Rustに慣れると他言語でusingとかするのが面倒になってくるし、ついつい付け忘れて困る。
251デフォルトの名無しさん
2020/03/24(火) 00:09:09.52ID:PY48eDSf Kotlinスレでnullポインタの方が良いと
荒らしてたのと同一人物だったのか
荒らしてたのと同一人物だったのか
252デフォルトの名無しさん
2020/03/24(火) 02:50:53.94ID:T0vrM+QL 体制側と違う意見は大事。
自分の頭で考えない人は、効能書きや権威やネットで書かれたことを鵜呑みにしてしまう。
自分の頭で考えない人は、効能書きや権威やネットで書かれたことを鵜呑みにしてしまう。
253デフォルトの名無しさん
2020/03/24(火) 10:04:19.30ID:cgACDOV9 メモリ以外のリソース回収なんてむしろなくね
254デフォルトの名無しさん
2020/03/24(火) 10:37:53.99ID:1n+V7cka いやファイルポインタ、コネクション、スレッドなどいくらでもあるだろ。
255デフォルトの名無しさん
2020/03/24(火) 12:20:20.31ID:T0vrM+QL >>250
こんな出てきたばかりの言語に慣れてる人なんているかい。
こんな出てきたばかりの言語に慣れてる人なんているかい。
256デフォルトの名無しさん
2020/03/24(火) 12:43:11.53ID:I6AqzmeH ファイルハンドルくらいならusingでもいいけど、デバイスコンテキストみたいな微妙に寿命が長いのが困る。
Disposeとか呼び忘れても大抵GCが回収してくれてぱっと見動くけど、
時々回収してくれなくて再現性の低いバグになるとか。
Disposeとか呼び忘れても大抵GCが回収してくれてぱっと見動くけど、
時々回収してくれなくて再現性の低いバグになるとか。
257デフォルトの名無しさん
2020/03/24(火) 14:22:30.48ID:T0vrM+QL Box<T>のソースを見ていたら、Box::new が次のような1行だけのソースで、
box キーワードを調べてみたら、組み込みの Box::new の実装とだけしか
情報がない。つまり、ソースがあるようで実質的には無い:
impl<T> Box<T> {
pub fn new(x: T) -> Box<T> {
box x
}
}
同様に Vec<T> のソースを見ていたら、RawVec なるものが出ていて、
RawVecのソースもあったがそこで、core::ptr なるものが使ってあり、
そのソースはないようだ。
Cにとってかわるシステム言語と言いながら、本質的には組み込み関数ばかりで
ソースを追っていくことができない。
Cは最初から理解できて、このような闇が存在しないので、高級アセンブラであり、
システム言語であった。
Rustにはその代わりは務まらないのではないか。
box キーワードを調べてみたら、組み込みの Box::new の実装とだけしか
情報がない。つまり、ソースがあるようで実質的には無い:
impl<T> Box<T> {
pub fn new(x: T) -> Box<T> {
box x
}
}
同様に Vec<T> のソースを見ていたら、RawVec なるものが出ていて、
RawVecのソースもあったがそこで、core::ptr なるものが使ってあり、
そのソースはないようだ。
Cにとってかわるシステム言語と言いながら、本質的には組み込み関数ばかりで
ソースを追っていくことができない。
Cは最初から理解できて、このような闇が存在しないので、高級アセンブラであり、
システム言語であった。
Rustにはその代わりは務まらないのではないか。
258デフォルトの名無しさん
2020/03/24(火) 14:31:46.69ID:e2obE13Z ツッコミどころ満載だけど
荒らしの相手したら負け
荒らしの相手したら負け
259デフォルトの名無しさん
2020/03/24(火) 14:40:33.66ID:JQ7YmFwi 正しく
怖がる
怖がる
260デフォルトの名無しさん
2020/03/24(火) 14:43:56.87ID:oKMcqgHf 巨大学術掲示板群 - アルファ・ラボ
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
261デフォルトの名無しさん
2020/03/24(火) 14:44:12.30ID:T0vrM+QL Rustは概念が整理されてない。
Cは、ポインタという概念さえ理解すれば(そしてそれは、プログラミングに適性が有る人にはそんなに難しいわけではない)、それだけを頼りにあらゆるものが構築できた。
ところが、Rustはいくら学んでも終わりが無いくらい基礎の部分が難しい。
Box<T>が何をやっているかは、自然言語で説明されるばかりで肝心の
コードも擬似コードもなかなか見つからない。
Cは、ポインタという概念さえ理解すれば(そしてそれは、プログラミングに適性が有る人にはそんなに難しいわけではない)、それだけを頼りにあらゆるものが構築できた。
ところが、Rustはいくら学んでも終わりが無いくらい基礎の部分が難しい。
Box<T>が何をやっているかは、自然言語で説明されるばかりで肝心の
コードも擬似コードもなかなか見つからない。
262デフォルトの名無しさん
2020/03/24(火) 15:04:27.63ID:T0vrM+QL Box<T>のデストラクタである所の Drop trait の drop 関数を調べてみると、
次のようになっており、compilerの埋め込み処理というコメントになっている。
恐らく、Box<T>が削除される際にコンパイラが何らかの処理を入れているが、
ソース中には書いてない。
こんな状態で Cの後釜を名乗ってほしくない。
unsafe impl<#[may_dangle] T: ?Sized> Drop for Box<T> {
fn drop(&mut self) {
// FIXME: Do nothing, drop is currently performed by compiler.
}
}
次のようになっており、compilerの埋め込み処理というコメントになっている。
恐らく、Box<T>が削除される際にコンパイラが何らかの処理を入れているが、
ソース中には書いてない。
こんな状態で Cの後釜を名乗ってほしくない。
unsafe impl<#[may_dangle] T: ?Sized> Drop for Box<T> {
fn drop(&mut self) {
// FIXME: Do nothing, drop is currently performed by compiler.
}
}
263デフォルトの名無しさん
2020/03/24(火) 15:45:47.44ID:noFaRAc6264デフォルトの名無しさん
2020/03/24(火) 16:11:12.01ID:T0vrM+QL Option<Box<T>> で、Some(Box::new<xxx>)
とした場合に、どういう状況の時に このメモリが解放されるのか、
その仕組みも分かりにくい。
とした場合に、どういう状況の時に このメモリが解放されるのか、
その仕組みも分かりにくい。
265デフォルトの名無しさん
2020/03/24(火) 16:46:57.83ID:T0vrM+QL266デフォルトの名無しさん
2020/03/24(火) 17:02:53.60ID:SD2kTFQw なんぼ間違えんねん落ち着けや
267デフォルトの名無しさん
2020/03/24(火) 17:20:04.56ID:T0vrM+QL Rustでの代入記号は、i32/f32/bool/str などのprimitive型以外は原則的に copy動作
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。
Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:
#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。
Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:
#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
268デフォルトの名無しさん
2020/03/24(火) 17:21:21.85ID:T0vrM+QL269デフォルトの名無しさん
2020/03/24(火) 17:31:35.81ID:UBy3gEYu270デフォルトの名無しさん
2020/03/24(火) 18:30:07.73ID:le7GgsxJ271デフォルトの名無しさん
2020/03/24(火) 18:46:17.48ID:8wuqSfIx 汽車 汽車 チンポ チンポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
272デフォルトの名無しさん
2020/03/24(火) 19:01:03.96ID:SD2kTFQw >>278
期待してるぞ
期待してるぞ
273デフォルトの名無しさん
2020/03/24(火) 23:11:28.78ID:UBy3gEYu >>278
それコンパイラのソースじゃないよ
それコンパイラのソースじゃないよ
274デフォルトの名無しさん
2020/03/25(水) 01:18:57.46ID:COJzGufp Rustは、コンパイラ時エラーに悩まされる反面、実行時エラーに悩まされるのを減らす
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。
なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。
なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
275デフォルトの名無しさん
2020/03/25(水) 01:25:39.41ID:COJzGufp >>274
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
正しいことを保障できなかったり、自動化できなかったりするため、
しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
正しいことを保障できなかったり、自動化できなかったりするため、
しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
276デフォルトの名無しさん
2020/03/25(水) 01:26:44.15ID:atIoOIeM コピペじゃなかったのか…ウケるw
277デフォルトの名無しさん
2020/03/25(水) 07:56:19.45ID:B3ciLpqT みんなドキュメントコメントで日本語も一緒に書くときってどうしてる?
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
278デフォルトの名無しさん
2020/03/25(水) 08:01:15.06ID:ukHBAVn8 例が悪いわ。
そんな糞コメント書くな、になってしまう。
そんな糞コメント書くな、になってしまう。
279デフォルトの名無しさん
2020/03/25(水) 08:57:55.31ID:3gLrCiKq >>278
期待を裏切りよって
期待を裏切りよって
280デフォルトの名無しさん
2020/03/25(水) 09:06:21.89ID:99YP/w74 言いたいことも言えないこんな世の中じゃポイズン
281デフォルトの名無しさん
2020/03/25(水) 11:14:11.00ID:mufeRxy0 Cからprintln使ってるRustの関数呼ぶとメモリリークしよる(´・ω・`)
282デフォルトの名無しさん
2020/03/25(水) 12:42:04.62ID:gIHmoeQz >>277
それコメントの意味なくね?
それコメントの意味なくね?
283デフォルトの名無しさん
2020/03/25(水) 14:08:14.89ID:rak19Gqk284デフォルトの名無しさん
2020/03/25(水) 16:36:38.82ID:6bd+J6i5 今だにCopyトレイトの命名は失敗だと再確認する
285デフォルトの名無しさん
2020/03/26(木) 02:55:12.87ID:q1LILc/b Box<T> は copy ではなく move なんだとさ。
286デフォルトの名無しさん
2020/03/26(木) 02:58:28.01ID:q1LILc/b287デフォルトの名無しさん
2020/03/26(木) 03:37:08.94ID:lC9OKNgA 中身がCopyのときだけOptionもCopyになるんじゃないの??
288デフォルトの名無しさん
2020/03/26(木) 03:46:23.72ID:2WcXgaRB >>287
分からない。
分からない。
289デフォルトの名無しさん
2020/03/26(木) 03:48:11.78ID:2WcXgaRB >>285
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
290デフォルトの名無しさん
2020/03/26(木) 04:59:35.60ID:2WcXgaRB struct のメンバに local 変数を代入した場合、エラーになる?
291デフォルトの名無しさん
2020/03/26(木) 12:36:34.09ID:Rq1Q9bYl https://doc.rust-lang.org/std/option/enum.Option.html#impl-Copy
impl<T> Copy for Option<T> where T: Copy {}
impl<T> Copy for Option<T> where T: Copy {}
292デフォルトの名無しさん
2020/03/26(木) 14:56:26.41ID:RidRralQ293デフォルトの名無しさん
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++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
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
}
つまりは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
}
394デフォルトの名無しさん
2020/04/06(月) 00:54:32.32ID:jrbG9hxT395デフォルトの名無しさん
2020/04/06(月) 00:59:52.27ID:jrbG9hxT あと関数内部で配列生成したら
そのlifetimeが関数内に閉じるので参照も返せないね
そのlifetimeが関数内に閉じるので参照も返せないね
396デフォルトの名無しさん
2020/04/06(月) 01:07:26.57ID:jrbG9hxT やるとしたら
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
397デフォルトの名無しさん
2020/04/06(月) 01:16:22.32ID:FD55gb+K C言語でいうところの if ( (c=foo()) == bar) { ...(cを使う処理)
みたいなことやりたいんですがどうすればいいですか?
fooが結構重くて2回呼び出したくないのですが、
let c = foo();
if c == bar {...
とやるしかない?
みたいなことやりたいんですがどうすればいいですか?
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+3C400デフォルトの名無しさん
2020/04/06(月) 03:03:32.80ID:jrbG9hxT >>397
@ bindingってのを使う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826
@ bindingってのを使う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826
401デフォルトの名無しさん
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
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
402デフォルトの名無しさん
2020/04/06(月) 22:14:10.89ID:/YOLus+e403デフォルトの名無しさん
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できないので不便
例えばイベント駆動の何かを作るときには考えた方が良いかと思う
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できないので不便
404デフォルトの名無しさん
2020/04/06(月) 23:45:59.83ID:TaQVQ6iW >>402
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)
トレイトを実装している型を実際には一種類しか使わないのだったら、
実行時間を除けば見かけ上の動作で違いはないかもしれんな。
でも基本的にはやりたいことを出来る範囲で制約は厳しい方がいい。
間違いの検出される可能性が高まるから。
制約をどのように表現するかというのはプログラミング言語の設計においては重要なトピックで、
構造化プログラミングが提唱されたのも goto だと制御をどこへ移動するのか制約を付けられないってのがある。
さらにそれを発展させた形として型で制約を付けようってのが色々と考えられてきたし、
Rust では更にオブジェクトの寿命に制約を付けようという考えが実現された。
その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)
トレイトを実装している型を実際には一種類しか使わないのだったら、
実行時間を除けば見かけ上の動作で違いはないかもしれんな。
でも基本的にはやりたいことを出来る範囲で制約は厳しい方がいい。
間違いの検出される可能性が高まるから。
制約をどのように表現するかというのはプログラミング言語の設計においては重要なトピックで、
構造化プログラミングが提唱されたのも goto だと制御をどこへ移動するのか制約を付けられないってのがある。
さらにそれを発展させた形として型で制約を付けようってのが色々と考えられてきたし、
Rust では更にオブジェクトの寿命に制約を付けようという考えが実現された。
その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
405デフォルトの名無しさん
2020/04/07(火) 08:14:23.99ID:FPXvnSDp APIサーバーでJSON受け取るときに値の型が違ったりオーバーフローするときってどうしてる?
serde_json::from_str で構造体の属性でエラーメッセージとかつけれたらいいのにな
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じゃないから辛い
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
こういう風にちゃんとパス書かれたのもあれば、デフォルトインポートされてないのに省略されてる型あるけどどうなってるの?
https://doc.rust-lang.org/std/ops/trait.Drop.html
411デフォルトの名無しさん
2020/04/11(土) 23:59:49.19ID:Ni1vKiQd フルパス書かなくてもいいように
mod.rsに指定されてるものとされてないもの
mod.rsに指定されてるものとされてないもの
412デフォルトの名無しさん
2020/04/12(日) 23:38:47.63ID:dFThPQBr クロージャの再帰呼び出しってできないんですか?
413デフォルトの名無しさん
2020/04/13(月) 09:02:25.60ID:45YCco/F それが必要な理由は?ここはお前の便利帳じゃねーんだから
有益な使い方が有れば紹介してから聞け
有益な使い方が有れば紹介してから聞け
415デフォルトの名無しさん
2020/04/13(月) 11:59:07.30ID:WFzH9Pd8416デフォルトの名無しさん
2020/04/14(火) 07:17:51.31ID:WrIQImmd Copyでの関数呼び出しとポインタ作成ってコスト的にはプリミティブのどの型からが処理重い?
ここらへんCSの知識ないからわかんない
ここらへんCSの知識ないからわかんない
417デフォルトの名無しさん
2020/04/15(水) 02:35:11.54ID:rawye3jg Rust仕事で使ってる人〜
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
418デフォルトの名無しさん
2020/04/15(水) 02:44:45.60ID:hMxv+37E あらら(´・ω・`)
419デフォルトの名無しさん
2020/04/15(水) 05:30:29.65ID:SZSUFLJC 組み込みで試験的に導入したけどムズイ
まあ慣れの問題もあるのだろうけど
まあ慣れの問題もあるのだろうけど
420デフォルトの名無しさん
2020/04/15(水) 21:10:37.56ID:mcKFmUGe 組み込みでrustに似た言語。ATS2が。
421デフォルトの名無しさん
2020/04/15(水) 21:11:58.85ID:60TKpqE+ Nimは?
422デフォルトの名無しさん
2020/04/15(水) 21:27:25.14ID:8I3eMZIA ATS2ってRust以上にドキュメントが少なくてHaskell以上に難解なアレじゃないですかやだー!
423デフォルトの名無しさん
2020/04/15(水) 23:28:51.38ID:hMxv+37E やだー!
424デフォルトの名無しさん
2020/04/16(木) 09:03:49.64ID:YGIESbh5 Rust界隈で一番貢献度高いのってAlexとかになるかな?
425デフォルトの名無しさん
2020/04/17(金) 14:41:30.42ID:SjHnVlOc Microsoftに期待してるんだが今はそれどころじゃ無さそう
426デフォルトの名無しさん
2020/04/18(土) 00:35:43.07ID:Dq0Xmd2Y Alexは人の話聞けっていう
427デフォルトの名無しさん
2020/04/18(土) 07:35:23.99ID:mN+EtaBg428デフォルトの名無しさん
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でコンパイルを通すにはどうすればよいのでしょうか?
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が人の話聞かないってこと?
430デフォルトの名無しさん
2020/04/19(日) 10:46:13.87ID:8Q+7ObaB ダメ出しよろ https://ideone.com/fswv4P
431デフォルトの名無しさん
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();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
個人的には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();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
433デフォルトの名無しさん
2020/04/23(木) 19:29:00.20ID:WjWrG05V トレイトって機能を追加するときどういう機能であるかの特徴を一見して分かりやすくするためだけのもの?
434デフォルトの名無しさん
2020/04/23(木) 20:53:30.42ID:87GHMCpD 振る舞いや
435デフォルトの名無しさん
2020/04/23(木) 22:36:03.84ID:5udoMUF9436デフォルトの名無しさん
2020/04/25(土) 02:58:36.79ID:FXjmUrQ8 これライフタイム記述を省略できないのなんで? https://git.io/JfL6t
437デフォルトの名無しさん
2020/04/25(土) 21:29:12.23ID:2AkpFzKs 省略してコンパイラ通るけどstableは無理なん?
438デフォルトの名無しさん
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
他にやりかたある?
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
439デフォルトの名無しさん
2020/04/26(日) 01:44:31.54ID:bgNhzTiH440デフォルトの名無しさん
2020/04/26(日) 01:49:37.98ID:bgNhzTiH https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b03bef5cb6f98821032c5fb1cce618a1
441デフォルトの名無しさん
2020/04/26(日) 08:01:37.17ID:eoUYVhAX そのコードは実際に使うコードじゃなくてさあ、変数が何個もあったりすると関数切り出しは引数が地獄になるじゃん
442デフォルトの名無しさん
2020/04/26(日) 11:00:13.57ID:bgNhzTiH その例でマクロかクロージャの二択ならクロージャだけど
>>438のは外側の変数をキャプチャすることで複雑化してるから&tangoを渡すようにする
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ec760be4190e2ad4ab21fbea3c84b0ed
そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
>>438のは外側の変数をキャプチャすることで複雑化してるから&tangoを渡すようにする
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ec760be4190e2ad4ab21fbea3c84b0ed
そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
443デフォルトの名無しさん
2020/04/26(日) 12:20:05.30ID:9haVb0dh Rustの問題集みたいなのってあったりする?
444デフォルトの名無しさん
2020/04/26(日) 12:50:17.90ID:9haVb0dh この連休である程度かけるようになりたい
445デフォルトの名無しさん
2020/04/26(日) 14:52:26.46ID:WcQXqCZk 連休だけでRustかけると思うことが間違ってるよ
446デフォルトの名無しさん
2020/04/26(日) 15:59:36.18ID:bgNhzTiH 公式のGithubにrustlingsっていう簡単な練習問題がある
The Bookを読んだ後に基本文法をおさらいしたい人向け
https://github.com/rust-lang/rustlings
The Bookを読んだ後に基本文法をおさらいしたい人向け
https://github.com/rust-lang/rustlings
447デフォルトの名無しさん
2020/04/26(日) 16:01:54.22ID:9haVb0dh >>446
うおおおおおおサンクス
うおおおおおおサンクス
448デフォルトの名無しさん
2020/04/27(月) 05:09:42.36ID:4dCrlHPD ↓Vecだと動くのに配列にするとコンパイルできないの何で?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6321129e5cc3853ef1421d706e19a136
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6321129e5cc3853ef1421d706e19a136
449デフォルトの名無しさん
2020/04/27(月) 06:06:02.00ID:9c9dxgXm 配列にinto_iterしてもmoveされずに参照が返るから
450デフォルトの名無しさん
2020/04/27(月) 09:24:11.80ID:xj40wisa rustいつのまにか蟹のイメージになってるけど、オライリーの影響?それとももっと前から何かあるのかな?
451デフォルトの名無しさん
2020/04/27(月) 09:35:35.74ID:qLbh0tK5 よくしらんけどこれじゃね?
https://rustacean.net/
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
ってなるんだけどバグ?
heap.push(10);
heap.push(9);
heap.push(20);
for x in &heap {
println!("{:?}", x);
}
これでバイナリヒープすると
20
9
10
ってなるんだけどバグ?
453デフォルトの名無しさん
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可能
配列のIntoIteratorは
&[T; N]と&mut [T; N]に対して実装されてるが[T; N]に対しては実装されてないのでmove不可
対してVecのIntoIteratorは
&Vec<T>と&mut Vec<T>だけでなくVec<T>に対しても実装されてるので
moveが必要なコンテキストならIntoIterator for Vec<T>が選択されmove可能
454デフォルトの名無しさん
2020/04/27(月) 12:53:27.20ID:ucpPL8Eb >>452
ドキュメントに書いてある通り、iterは適当な順序で出てくるので仕様。
https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html
ドキュメントに書いてある通り、iterは適当な順序で出てくるので仕様。
https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html
455デフォルトの名無しさん
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
配列でやりたい場合は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
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
457デフォルトの名無しさん
2020/04/27(月) 15:43:57.57ID:vsE9eV5m >>454
thx 見逃してた
thx 見逃してた
458デフォルトの名無しさん
2020/04/27(月) 17:58:08.76ID:4dCrlHPD 配列のIntoIteratorにmoveが実装されてないの何で?
459デフォルトの名無しさん
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
詳しいことはよくわからないけど実装が難しかったみたいよ
興味あればこのissue読んでみて
https://github.com/rust-lang/rust/issues/25725
nightly使えばmoveできる機能はあるみたい
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=6a22ab054f5ec52ea942a1186710a516
460デフォルトの名無しさん
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は全順序や!
型制約見ればええんやで。
`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は全順序や!
461デフォルトの名無しさん
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();
}
}
if nanika_shori().filter(hoshiimonokana).is_some() {
hoge();
mitsukatta();
} else {
fuga();
mitsukaranakatta();
}
match nanika_shori() {
Some(butsu) if hoshiimonokana(butsu) => {
hoge();
mitsukatta();
}
_ => {
fuga();
mitsukaranakatta();
}
}
462デフォルトの名無しさん
2020/04/28(火) 01:37:40.02ID:aaB86vh6463デフォルトの名無しさん
2020/04/28(火) 02:09:21.04ID:nfkWT3p7 テレワーク中なのか連休入ったせいなのか知らんけど猛者が全部回答してくれるから助かるわ
464デフォルトの名無しさん
2020/04/28(火) 07:51:49.83ID:SJTliuFD >>461
前者
前者
465デフォルトの名無しさん
2020/04/28(火) 11:46:15.82ID:nnss28av >>461
match nanika_shori().filter(hoshiimonokana) {
Some(x) => {…},
None => {…}
}
か
if let Some(x) = nanika_shori().filter(hoshiimononanoka) {…} else {…}
か
boolを返す関数作ってif else
fn are_aruka(hoshiimono: Hoge) -> bool {
match nanika_shori() {
Some(x) if x == hoshiimono => true,
_ => false
}
}
match nanika_shori().filter(hoshiimonokana) {
Some(x) => {…},
None => {…}
}
か
if let Some(x) = nanika_shori().filter(hoshiimononanoka) {…} else {…}
か
boolを返す関数作ってif else
fn are_aruka(hoshiimono: Hoge) -> bool {
match nanika_shori() {
Some(x) if x == hoshiimono => true,
_ => false
}
}
466デフォルトの名無しさん
2020/04/28(火) 12:32:50.40ID:GQyYGa/W filter(...).is_some()
って形はかなり読みにくい
ようは設計が悪い
って形はかなり読みにくい
ようは設計が悪い
467デフォルトの名無しさん
2020/04/29(水) 02:11:05.39ID:mpM8GrXg ResultやOptionが複数ネストしたやつをイイカンジにmapとかやれるか
468デフォルトの名無しさん
2020/04/29(水) 18:51:17.07ID:F+b7zcTP flatMap 的な?
469デフォルトの名無しさん
2020/04/29(水) 20:08:03.11ID:lsvcqJYy Rustやる前に軽くScalaとかHaskellやっとけば
コレクションライブラリ見たときに「あっ、これ進研ゼミでやったところだ!」って
なるから理解が早いよ
コレクションライブラリ見たときに「あっ、これ進研ゼミでやったところだ!」って
なるから理解が早いよ
470デフォルトの名無しさん
2020/04/29(水) 23:56:45.59ID:VSyDHJCJ ゼミ講習の変態度が高過ぎるわ
471デフォルトの名無しさん
2020/04/30(木) 05:16:29.11ID:yR2jzUGm このコードがコンパイル通って実行できて期待した実行結果にならない
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4472067bedcd681b8154620b3023f278
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4472067bedcd681b8154620b3023f278
472デフォルトの名無しさん
2020/04/30(木) 11:08:02.17ID:aC6sOq5z >>471
警告を消しなよ
警告を消しなよ
473デフォルトの名無しさん
2020/05/01(金) 05:37:23.81ID:+OCTqmPQ HashMapでキーを参照にしたときキーがアドレス値にならないのなんで?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9f33505748c782a7b5a2cd22481e5b68
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9f33505748c782a7b5a2cd22481e5b68
474デフォルトの名無しさん
2020/05/01(金) 09:19:46.17ID:xXuuls7c >>473
&strのEqはアドレス比較じゃないから
&strのEqはアドレス比較じゃないから
475デフォルトの名無しさん
2020/05/01(金) 10:58:05.97ID:gc2qK0CV476デフォルトの名無しさん
2020/05/01(金) 12:59:00.58ID:wrmDV0oq Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
dynamic linkする場合は、8.2MBになるらしい。
dynamic linkで、さらにサイズ重視最適化した場合、4.6MB、strip した場合、
3.1MBになる。
でも、C++に変わる言語を標榜するにしては大きすぎる。
https://www.quora.com/Why-are-the-Rust-and-Go-binaries-so-large-compared-to-C-or-Pascal
dynamic linkする場合は、8.2MBになるらしい。
dynamic linkで、さらにサイズ重視最適化した場合、4.6MB、strip した場合、
3.1MBになる。
でも、C++に変わる言語を標榜するにしては大きすぎる。
https://www.quora.com/Why-are-the-Rust-and-Go-binaries-so-large-compared-to-C-or-Pascal
477デフォルトの名無しさん
2020/05/01(金) 13:58:13.26ID:xXuuls7c >>476
>Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
>dynamic linkする場合は、8.2MBになるらしい。
Debugモードが61MB
Releaseモード(デフォルト設定)が8.2MB って書いてるよ
それにlinkするのはRuntimeではない
もう少しちゃんと読もう
>Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
>dynamic linkする場合は、8.2MBになるらしい。
Debugモードが61MB
Releaseモード(デフォルト設定)が8.2MB って書いてるよ
それにlinkするのはRuntimeではない
もう少しちゃんと読もう
478デフォルトの名無しさん
2020/05/01(金) 13:58:40.83ID:i4mzH/oB479デフォルトの名無しさん
2020/05/01(金) 20:43:43.74ID:suCtdez/480デフォルトの名無しさん
2020/05/01(金) 21:17:00.16ID:iuGoF6Kh https://lifthrasiir.github.io/rustlog/why-is-a-rust-executable-large.html
これとかは結構限界まで削ってる感じかな。ちょっと古いけど。
あと
https://github.com/johnthagen/min-sized-rust/blob/master/README.md
にサイズ最適化したいときのやり方一覧がある。
これとかは結構限界まで削ってる感じかな。ちょっと古いけど。
あと
https://github.com/johnthagen/min-sized-rust/blob/master/README.md
にサイズ最適化したいときのやり方一覧がある。
481デフォルトの名無しさん
2020/05/02(土) 00:00:07.90ID:rieFiUeI release profileでもデバッグシンボル含めてるからprofileオプション安定化までお預けかな。
482デフォルトの名無しさん
2020/05/02(土) 01:05:23.19ID:RJOTvgjs アイデアありませんか?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=88804aace268a5d6adbdf8a8e4423fe4
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=88804aace268a5d6adbdf8a8e4423fe4
483デフォルトの名無しさん
2020/05/02(土) 02:00:10.73ID:HIdampCl scanでどうでしょ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0092b046fa5b3fa9f1aba90d35a93f4a
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0092b046fa5b3fa9f1aba90d35a93f4a
484デフォルトの名無しさん
2020/05/02(土) 10:05:59.92ID:8Sc54whm お前らおっぱいだって大きいほうが好きなくせに何バイナリのファイルサイズが大きめだからって文句言ってるんだよ
485デフォルトの名無しさん
2020/05/02(土) 10:07:50.85ID:aaZCC6Sm 貧乳が至高
これだけは譲れない
これだけは譲れない
486デフォルトの名無しさん
2020/05/02(土) 11:59:56.20ID:UBE5VHp1 バイナリサイズの話題ってずーっと昔に出てたよな
ここで出たのかどこで見たのか忘れたけど
Why are Rust executables so huge?
https://stackoverflow.com/questions/29008127
これかなぁ?
ここで出たのかどこで見たのか忘れたけど
Why are Rust executables so huge?
https://stackoverflow.com/questions/29008127
これかなぁ?
487デフォルトの名無しさん
2020/05/02(土) 12:05:15.40ID:UBE5VHp1488デフォルトの名無しさん
2020/05/02(土) 15:10:30.93ID:f7vdsp57 let hoge = match s {
"hage" => hage,
"moge"=> moge, // 何かの関数や構造体を返そうとしたがhogeは一意の型しか受け取らないから無理
_=> return
}
loop {
hoge()
}
的な事やろうと色々試したけど、超絶複雑な事になってヤバい匂いしかしない。
ループの外でループ内で呼ぶ関数の分岐を書くのは何かのアンチパターンなのか
そもそも、ループの中でMatch書いても外からイミュータブルな値を渡すの分かってるなら
コンパイラが最適化してループ毎に分岐なんてしないから普通に入れて書けば良い?
"hage" => hage,
"moge"=> moge, // 何かの関数や構造体を返そうとしたがhogeは一意の型しか受け取らないから無理
_=> return
}
loop {
hoge()
}
的な事やろうと色々試したけど、超絶複雑な事になってヤバい匂いしかしない。
ループの外でループ内で呼ぶ関数の分岐を書くのは何かのアンチパターンなのか
そもそも、ループの中でMatch書いても外からイミュータブルな値を渡すの分かってるなら
コンパイラが最適化してループ毎に分岐なんてしないから普通に入れて書けば良い?
489デフォルトの名無しさん
2020/05/02(土) 16:28:13.09ID:0Y98m9EQ >>482
inclusiveなtake_untilは標準では無いみたいだから自分で作るかcrate探すかになるっぽい
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b74ec6655adc38e1e790a35485eee01c
https://github.com/rust-lang/rust/issues/62208
既存Traitを拡張するのはめんどくさいから
自分ならイテレータを受け取ってイテレータを返す関数で我慢する
inclusiveなtake_untilは標準では無いみたいだから自分で作るかcrate探すかになるっぽい
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b74ec6655adc38e1e790a35485eee01c
https://github.com/rust-lang/rust/issues/62208
既存Traitを拡張するのはめんどくさいから
自分ならイテレータを受け取ってイテレータを返す関数で我慢する
490デフォルトの名無しさん
2020/05/02(土) 16:54:44.18ID:4YXjnjKT491デフォルトの名無しさん
2020/05/02(土) 16:58:06.87ID:4YXjnjKT あるいはFnとかにして型を揃えれば
loop内の分岐はなくなるかな。
たださっきも書いた通り分岐をなくすことに
それほど意味があるとも思えない。
loop内の分岐はなくなるかな。
たださっきも書いた通り分岐をなくすことに
それほど意味があるとも思えない。
492デフォルトの名無しさん
2020/05/03(日) 03:41:22.86ID:HKq7AyzP こういうパターンマッチの使い方ってマイナー?保守性が悪い?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=29945c6422cbc643197b73631691211b
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=29945c6422cbc643197b73631691211b
493デフォルトの名無しさん
2020/05/03(日) 14:40:33.37ID:CQw0w+cb >>488
enumで紐つけても結局hogeでmatch使う事になる。
Fnで返すと所謂if文と関数ポインタどっちが早い?的な事になって
最適化するとif文のが早くなる。つまりループの中でMatchしとけば良い。
enumで紐つけても結局hogeでmatch使う事になる。
Fnで返すと所謂if文と関数ポインタどっちが早い?的な事になって
最適化するとif文のが早くなる。つまりループの中でMatchしとけば良い。
494デフォルトの名無しさん
2020/05/03(日) 21:48:29.60ID:zX3s2fU5 rustのenumはsum typeだからjitがあればmegamorphicでもtracingじゃなくてもjit効いて
インラインキャッシュも必要ないからそのままインライン展開出来るんだが、この辺がAOTの限界だな。
まあ、分岐予測外れるような呼び出しなら初めからvtable使うだろう。
Rust/WinRT見てc++と違っていきなりマクロ出てくるからMFCの悪夢が蘇った。
インラインキャッシュも必要ないからそのままインライン展開出来るんだが、この辺がAOTの限界だな。
まあ、分岐予測外れるような呼び出しなら初めからvtable使うだろう。
Rust/WinRT見てc++と違っていきなりマクロ出てくるからMFCの悪夢が蘇った。
495デフォルトの名無しさん
2020/05/03(日) 22:46:23.02ID:zpY+Khfl >>492
ローカルにあるcrateとrustのソースをgrepしてみたがほとんど使われてないね
シグニチャに書くことで可読性が高まるケースであれば使えばいいと思うけど
そうじゃなければ一旦受けてから関数内で分割したほうがよさそう
ローカルにあるcrateとrustのソースをgrepしてみたがほとんど使われてないね
シグニチャに書くことで可読性が高まるケースであれば使えばいいと思うけど
そうじゃなければ一旦受けてから関数内で分割したほうがよさそう
496デフォルトの名無しさん
2020/05/04(月) 11:52:28.65ID:sauq4xLT レンジ自体にマッチしたいんだけど書きかたって今はない?
match 1..3 {
2..3 => println!("2..3"),
1...3 => println!("matched!"),
_ => println!("_"),
}
match 1..3 {
2..3 => println!("2..3"),
1...3 => println!("matched!"),
_ => println!("_"),
}
497デフォルトの名無しさん
2020/05/04(月) 12:22:11.14ID:au6sJ5VU >>496
use std::ops::Range;
match 1..3 {
Range{start: 2, end: 3} => println!("2..3"),
Range{start: 1, end: 3} => println!("matched!"),
_ => println!("_"),
}
use std::ops::Range;
match 1..3 {
Range{start: 2, end: 3} => println!("2..3"),
Range{start: 1, end: 3} => println!("matched!"),
_ => println!("_"),
}
498デフォルトの名無しさん
2020/05/05(火) 02:10:07.89ID:em9v0/Ay >>497
ありがとう。
でもなんで
match 1 {
1...2 => println!("matched!"),
_ => todo!(),
}
こっちのマッチは ... で一個点々多く使わないといけなくなったの?
Range{start: 2, end: 3}をつかうなら1...2じゃなくて1..2でもよかったんじゃ
ありがとう。
でもなんで
match 1 {
1...2 => println!("matched!"),
_ => todo!(),
}
こっちのマッチは ... で一個点々多く使わないといけなくなったの?
Range{start: 2, end: 3}をつかうなら1...2じゃなくて1..2でもよかったんじゃ
499デフォルトの名無しさん
2020/05/05(火) 03:39:54.86ID:ZuBK36Gv ...ってまだ使えるのか。..=に置き換えられたのかと
500デフォルトの名無しさん
2020/05/05(火) 09:01:40.68ID:uTsiWylk >>498
matchのarmでrangeを使うケースはほぼ100%inclusive rangeなので
half openのexclusive rangeとは区別して利便性を上げつつ
不用意なバグをコンパイル時に弾けるようにしたのが理由だと思うよ
>Range{start: 2, end: 3}をつかうなら1...2じゃなくて1..2でもよかったんじゃ
んん?
そもそも「レンジ自体にマッチしたい」ってどういう用途?
matchのarmでrangeを使うケースはほぼ100%inclusive rangeなので
half openのexclusive rangeとは区別して利便性を上げつつ
不用意なバグをコンパイル時に弾けるようにしたのが理由だと思うよ
>Range{start: 2, end: 3}をつかうなら1...2じゃなくて1..2でもよかったんじゃ
んん?
そもそも「レンジ自体にマッチしたい」ってどういう用途?
501デフォルトの名無しさん
2020/05/06(水) 11:12:57.23ID:exILxtx0 Rust の API についてはメソッドのシグネチャとコメントからドキュメントを生成できるけど、
バイナリクレートにユーザー向けのドキュメントを付けるときの作法とかってあるの?
バイナリクレートにユーザー向けのドキュメントを付けるときの作法とかってあるの?
502デフォルトの名無しさん
2020/05/06(水) 22:11:17.73ID:Rwb7Dx/N i32とかにあるdiv_euclidってどういうときに使うものなの?
503デフォルトの名無しさん
2020/05/06(水) 22:52:21.93ID:A+GAumiz >>502
「負数の剰余」で調べると違いが分かるかと。
「負数の剰余」で調べると違いが分かるかと。
504デフォルトの名無しさん
2020/05/07(木) 16:40:36.21ID:82eQknS5 ドキュメントコメントでのassetでのテストとmod testsってどう使い分けたらいいの?
ドキュメントテストすればユニットテスト書かなくていい?
ドキュメントは使用例だけで、assertでのテストって意味なくね?って思ってしまう。無視もできるし
ドキュメントテストすればユニットテスト書かなくていい?
ドキュメントは使用例だけで、assertでのテストって意味なくね?って思ってしまう。無視もできるし
505デフォルトの名無しさん
2020/05/07(木) 17:28:34.50ID:k47Mu4KT >>504
ドキュメントテストはドキュメントであってテストではない。
説明上分かりやすいならassertしてもいいけど、別になくてもいい。
それでもドキュメントテストを通すのは、古いサンプルコードがいつの間にかコンパイル通らなくなっている、というのを防ぐため。
ユニットテストは普通にmod testsで書けばいいよ。
ドキュメントテストはドキュメントであってテストではない。
説明上分かりやすいならassertしてもいいけど、別になくてもいい。
それでもドキュメントテストを通すのは、古いサンプルコードがいつの間にかコンパイル通らなくなっている、というのを防ぐため。
ユニットテストは普通にmod testsで書けばいいよ。
506デフォルトの名無しさん
2020/05/07(木) 18:37:23.38ID:ywncHnjy doit()はclone()が入るとエラーが出るんだけど何で?
TにCloneが必要って出て来るけどTの実体をCloneしないのに必要ないだろJKって感じのエラーなんだが?
これどうしたらいいの?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=31635004c1ad9fd9e5ba0f859f28ceb0
TにCloneが必要って出て来るけどTの実体をCloneしないのに必要ないだろJKって感じのエラーなんだが?
これどうしたらいいの?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=31635004c1ad9fd9e5ba0f859f28ceb0
507デフォルトの名無しさん
2020/05/07(木) 19:32:09.83ID:ywncHnjy508デフォルトの名無しさん
2020/05/07(木) 19:52:47.71ID:ywncHnjy これdoit()のget()がTに'static必要ってコンパイル失敗すんだけど
Tを直接扱ってないんだからTに'static要らんだろって感じなんだが?
関数ポインタくらい静的に解決できんだろJK
どうしたらいいんだよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b69fe063a3cc2fae6f1cc7536007fe8e
Tを直接扱ってないんだからTに'static要らんだろって感じなんだが?
関数ポインタくらい静的に解決できんだろJK
どうしたらいいんだよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b69fe063a3cc2fae6f1cc7536007fe8e
509デフォルトの名無しさん
2020/05/07(木) 21:47:17.14ID:82eQknS5510デフォルトの名無しさん
2020/05/07(木) 21:48:25.25ID:TSVqZJLC コンパイル通さずにどうやってassertだけ通すんじゃ
511デフォルトの名無しさん
2020/05/07(木) 22:52:31.79ID:ufUjH0LD >>508
doitのTにstaticを指定すればいい。fn <T:'static> doit ....
doitのTにstaticを指定すればいい。fn <T:'static> doit ....
512デフォルトの名無しさん
2020/05/07(木) 23:07:35.28ID:k47Mu4KT513デフォルトの名無しさん
2020/05/08(金) 15:31:13.15ID:2R+BCvOe なんで型って大文字始まりなのにi32とかは全部小文字始まりになってんの?
初期のデザインミス?
初期のデザインミス?
514デフォルトの名無しさん
2020/05/08(金) 15:47:25.70ID:Pb0t26ee primitiveは小文字で統一したんじゃないの?
515デフォルトの名無しさん
2020/05/08(金) 22:20:21.51ID:UFFnLRtI 0u32
みたいにサフィックスとしても使うし
みたいにサフィックスとしても使うし
516デフォルトの名無しさん
2020/05/09(土) 06:11:48.26ID:gxFlq1V3 Rustみたいに標準ライブラリは最小に留めてるような言語って他にありますか?
それとコンパイラ内部のCargo.tomlにライブラリのバージョン書けば別に最小に留めなくてもと思うんですが、どうでしょうか?
それとコンパイラ内部のCargo.tomlにライブラリのバージョン書けば別に最小に留めなくてもと思うんですが、どうでしょうか?
517デフォルトの名無しさん
2020/05/09(土) 10:20:58.87ID:MmeKQuXy >>516
Lua とか
Lua とか
518デフォルトの名無しさん
2020/05/10(日) 04:53:09.49ID:aajKhScH >>516
どこまでを最小というかによるがC++は似たようなもんじゃないかしら
どこまでを最小というかによるがC++は似たようなもんじゃないかしら
519デフォルトの名無しさん
2020/05/12(火) 08:44:05.53ID:l1cRSbJI これってなんで&mut になんの?
n: mut &i32のほうが差分的にも視覚的にもいいと思うけど、どっかに理由とか書かれてないかな?
fn example(n: &mut i32) {
}
let mut r = &10;
example(mut r);
n: mut &i32のほうが差分的にも視覚的にもいいと思うけど、どっかに理由とか書かれてないかな?
fn example(n: &mut i32) {
}
let mut r = &10;
example(mut r);
520デフォルトの名無しさん
2020/05/12(火) 10:47:54.41ID:yEVh4LKg521デフォルトの名無しさん
2020/05/12(火) 11:12:17.10ID:rr7jvTFY >>519
変数がmutableなのか、immutableなのかと
変数の型がownedなのか、shared referenceなのか、mutable referenceなのかとは別
mutable referenceを表す記号として`&mut`で一塊なのでmut &i32は微妙
n: mut i32みたいに型として意味のないコードを書いて
何が悪いのかわからないってことになりにくい
コンパイラ的にも`&`が先にあったほうが処理が簡単そう
変数がmutableなのか、immutableなのかと
変数の型がownedなのか、shared referenceなのか、mutable referenceなのかとは別
mutable referenceを表す記号として`&mut`で一塊なのでmut &i32は微妙
n: mut i32みたいに型として意味のないコードを書いて
何が悪いのかわからないってことになりにくい
コンパイラ的にも`&`が先にあったほうが処理が簡単そう
522デフォルトの名無しさん
2020/05/12(火) 17:14:57.85ID:pSulPVQF なるほど
523デフォルトの名無しさん
2020/05/12(火) 17:49:29.28ID:jco3JkFf524デフォルトの名無しさん
2020/05/12(火) 18:24:06.26ID:rr7jvTFY525デフォルトの名無しさん
2020/05/12(火) 19:18:36.86ID:j2+Ql/jy526デフォルトの名無しさん
2020/05/12(火) 21:20:08.42ID:rr7jvTFY527デフォルトの名無しさん
2020/05/12(火) 21:34:24.99ID:FmqTBss/ >>526
確かに勘違いしてた。今の文法だとmut x: &i32だった。
なので今は
x: &mut i32
mut x: &i32
を
x: mut &i32
mut x: &i32
にしても別に問題はないのか。なんとなく両者の区別はしにくくなってる気はするけど。
確かに勘違いしてた。今の文法だとmut x: &i32だった。
なので今は
x: &mut i32
mut x: &i32
を
x: mut &i32
mut x: &i32
にしても別に問題はないのか。なんとなく両者の区別はしにくくなってる気はするけど。
528デフォルトの名無しさん
2020/05/12(火) 21:45:24.39ID:l1cRSbJI529デフォルトの名無しさん
2020/05/12(火) 22:06:14.36ID:rr7jvTFY 本当の理由は知らないけど、その区別しにくくなるってところがポイントだったんじゃないのかな
mut i32はコンパイルエラーだろうけど、今はエラーメッセージ見ても
&mutがあれば型、mutがあれば変数のmutabilityって詳細読まなくてもすぐ分かる
慣れかもしれんが俺は今の文法のほうが読みやすいと感じる
let mut x: &mut &i32
let mut x: mut &&i32
let mut x: &mut &mut i32
let mut x: mut mut &&i32
mut i32はコンパイルエラーだろうけど、今はエラーメッセージ見ても
&mutがあれば型、mutがあれば変数のmutabilityって詳細読まなくてもすぐ分かる
慣れかもしれんが俺は今の文法のほうが読みやすいと感じる
let mut x: &mut &i32
let mut x: mut &&i32
let mut x: &mut &mut i32
let mut x: mut mut &&i32
530デフォルトの名無しさん
2020/05/12(火) 22:08:09.55ID:tQMnmew/ tokio使ってる人いる?
531デフォルトの名無しさん
2020/05/12(火) 22:36:30.89ID:RlXY9TUm532デフォルトの名無しさん
2020/05/13(水) 00:29:51.86ID:HS9NS6av actix-webでも中で使ってるしtokio単体でも使ってる
533デフォルトの名無しさん
2020/05/13(水) 01:28:10.47ID:IZIPIE/9 非同期に拘らないならstd::net使えばよくない
534デフォルトの名無しさん
2020/05/13(水) 14:58:18.04ID:n4QRUOl7 今の主流は tokio か async-std だけど io-uring 対応でまた勢力図に変化が起きたりするのだろうか
535デフォルトの名無しさん
2020/05/13(水) 22:46:58.63ID:0Q+bejh+ 乗り遅れた。
tokioは使ってないけどデスクトップでnon-blocking file ioが欲しい。ブロックしたら並列の意味がない。
>>531
ランタイムと付いてくるapiで肥大化するのが問題なんだよね。
tokioは使ってないけどデスクトップでnon-blocking file ioが欲しい。ブロックしたら並列の意味がない。
>>531
ランタイムと付いてくるapiで肥大化するのが問題なんだよね。
536デフォルトの名無しさん
2020/05/14(木) 04:55:54.76ID:hWqHBFy5 cargo clippyが通ってcargo buildが失敗するケースってある?
537デフォルトの名無しさん
2020/05/14(木) 09:41:17.62ID:WpNijTVY 望まぬ非同期は一応 tokio::runtime::current_thread::block_on_all() で回避できるか
それでもビルドが一気に遅くなる
それでもビルドが一気に遅くなる
538デフォルトの名無しさん
2020/05/14(木) 15:47:47.58ID:yNXnSs4i >>536
リンクでエラーになる場合とかはある
リンクでエラーになる場合とかはある
539デフォルトの名無しさん
2020/05/14(木) 18:17:46.89ID:nGNfHuw+ なるほど
540デフォルトの名無しさん
2020/05/14(木) 21:36:47.59ID:AoVs9mpY 日本のRust界隈で有用なRust関連のツイートしてる人教えて
541デフォルトの名無しさん
2020/05/14(木) 23:31:33.96ID:W3KxELdZ おれおれ
542デフォルトの名無しさん
2020/05/15(金) 09:40:19.45ID:OlE2WbGd 鷺
543デフォルトの名無しさん
2020/05/16(土) 07:49:09.76ID:4fgNGNa5 io-uringと今までの非同期処理の違いってなに?
パフォーマンスそれほど変わるもんなの
パフォーマンスそれほど変わるもんなの
544デフォルトの名無しさん
2020/05/16(土) 22:12:40.61ID:d7M+qUqk スレチ
545デフォルトの名無しさん
2020/05/18(月) 04:57:51.24ID:z6Kgscbk 返り値に &'static str ってライフタイム指定ないといけないけど、推論だけで解決できない問題があるから書かないといけないの?
Stringからderefで生成した&strでも結局はIO以外で来たStringは'staticでしょ?推論できそうだけど
Stringからderefで生成した&strでも結局はIO以外で来たStringは'staticでしょ?推論できそうだけど
546デフォルトの名無しさん
2020/05/18(月) 23:19:03.18ID:Uv/lNmsL >>540
てらモス
てらモス
547デフォルトの名無しさん
2020/05/19(火) 03:57:06.17ID:GltHdsbb IO以外で来たString、つまりコンパイル時に計算しろってことやな!
let mut string = String::from("abcde");
if long_long_time_consume() != 0 { string.insert(0, 'c') }
require_static_str(&string); // require_static_str : &'static str -> ()
というコードが正しいかどうか、実際に長い長ーい計算しないと分からないけどできるならやれってことやな!絶対使わんわ!
let mut string = String::from("abcde");
if long_long_time_consume() != 0 { string.insert(0, 'c') }
require_static_str(&string); // require_static_str : &'static str -> ()
というコードが正しいかどうか、実際に長い長ーい計算しないと分からないけどできるならやれってことやな!絶対使わんわ!
548デフォルトの名無しさん
2020/05/21(木) 00:27:51.21ID:uKmbRWt0 paizaにRustの問題ないのつら
549デフォルトの名無しさん
2020/05/21(木) 13:46:29.84ID:e7acrJyd 競技プログラミングだとアルゴリズムの理解はともかく言語機能の活用は必ずしも身につかないしなぁ……。
Rust のようなプログラミング言語はいかにして抽象化層を構築するか、
いかにしてミスを防ぐか、
そのために必要なのはどんな機能かに意識が割かれたデザインが多いので、
手早くやることが正義の競技プログラミングではマッチしない。
ステップアップには良いかもしれんが、初心者向けには各言語向けの課題が欲しいよね。
Rust のようなプログラミング言語はいかにして抽象化層を構築するか、
いかにしてミスを防ぐか、
そのために必要なのはどんな機能かに意識が割かれたデザインが多いので、
手早くやることが正義の競技プログラミングではマッチしない。
ステップアップには良いかもしれんが、初心者向けには各言語向けの課題が欲しいよね。
550デフォルトの名無しさん
2020/05/21(木) 19:20:37.36ID:y/uWQkFk enum MyEnum {
Foo,
Bar,
Baz,
}
のようなデータを載せないシンプルなenumで
Clone/CopyやPartialEq/Eqなどを実装しない場合ってどんな意図があったりするの?
Foo,
Bar,
Baz,
}
のようなデータを載せないシンプルなenumで
Clone/CopyやPartialEq/Eqなどを実装しない場合ってどんな意図があったりするの?
551デフォルトの名無しさん
2020/05/21(木) 19:32:35.91ID:BBt3dInh 意図もクソも本来の普通のenumだろ
値そのものに特に意味がなくて、複数のオプションを区別するためだけに使う単なる定数
値そのものに特に意味がなくて、複数のオプションを区別するためだけに使う単なる定数
552デフォルトの名無しさん
2020/05/21(木) 19:52:52.75ID:Ge5vC94Q ただのサボりだろ、省略することに意図なんて無い
553デフォルトの名無しさん
2020/05/22(金) 00:12:42.63ID:Aykyb680 Rc<Hoge>のHogeの参照を取りたいとき &*rc_hoge とするのと rc_hoge.as_ref() とするのとどっちがおすすめ?
554デフォルトの名無しさん
2020/05/22(金) 01:00:57.91ID:dJNhuRdN >>551
同意
同意
555デフォルトの名無しさん
2020/05/22(金) 09:19:49.56ID:JweU/zGV556デフォルトの名無しさん
2020/05/22(金) 20:50:02.94ID:ZwFuqcZd557デフォルトの名無しさん
2020/05/22(金) 21:08:41.77ID:4ZqbW+TE non_exhaustive で pub な enum は勝手に Copy になると意図せぬ破壊的変更を起こしやすくなってしまう
558デフォルトの名無しさん
2020/05/22(金) 21:09:50.79ID:4ZqbW+TE >>553
Hoge が AsRef 実装してるかもしれないから Rc::as_ref か &*
Hoge が AsRef 実装してるかもしれないから Rc::as_ref か &*
559デフォルトの名無しさん
2020/05/22(金) 21:16:35.95ID:/JyTX0fw 最近ずっと弄ってるけどRust難しいのう・・・
560デフォルトの名無しさん
2020/05/23(土) 09:31:16.71ID:Zkam+XNX C++がそうだからとかの理由はなしで
[[[i32; 3]; 3]; 3]
がなんで
[3; [3; [3; i32]]]
じゃないの?
行列の時かなり読みにくいしさ
[[[i32; 3]; 3]; 3]
がなんで
[3; [3; [3; i32]]]
じゃないの?
行列の時かなり読みにくいしさ
561デフォルトの名無しさん
2020/05/23(土) 12:43:47.04ID:Ax4YhvgI なしでと言うかC++erが記法にノイズを持ち込んでるのは明らかなんだが
562デフォルトの名無しさん
2020/05/23(土) 15:44:24.84ID:jzsRlJtI >>560
それって型としては [[[i32]]] なんでしょ?
大きさの情報は後付けというか、
補足的なニュアンスを感じるので後にくるのが自然だと受け入れてる。
実際のところはどういう議論があったのか知らんけど。
それって型としては [[[i32]]] なんでしょ?
大きさの情報は後付けというか、
補足的なニュアンスを感じるので後にくるのが自然だと受け入れてる。
実際のところはどういう議論があったのか知らんけど。
563デフォルトの名無しさん
2020/05/23(土) 19:37:35.36ID:Zkam+XNX564デフォルトの名無しさん
2020/05/23(土) 22:35:14.94ID:xQEe6NOh let x = Box::new(String::from("foo"));
let y = *x;
これyにmoveできるの入門ドキュメントで説明されてなかったから結構驚いた
let y = *x;
これyにmoveできるの入門ドキュメントで説明されてなかったから結構驚いた
565デフォルトの名無しさん
2020/05/23(土) 23:03:55.77ID:6goyk3s3566デフォルトの名無しさん
2020/05/24(日) 01:52:15.18ID:tkUtJ987567562
2020/05/24(日) 09:30:45.62ID:SCWt5xFf568デフォルトの名無しさん
2020/05/24(日) 17:28:53.26ID:tkUtJ987 >>567
そういうこと
もっと言うと [T] の要素数情報は配列自体ではなく配列への参照 (fat pointer) が保持してるから
[T] が単独で存在することはできなくて、
参照経由の &[T] やスマートポインタ経由の Box<[T]>, Rc<[T]> といった形でしか存在できない
そういうこと
もっと言うと [T] の要素数情報は配列自体ではなく配列への参照 (fat pointer) が保持してるから
[T] が単独で存在することはできなくて、
参照経由の &[T] やスマートポインタ経由の Box<[T]>, Rc<[T]> といった形でしか存在できない
569562
2020/05/24(日) 17:59:17.80ID:SCWt5xFf >>568
そういうことか。
fat pointer を基礎に据えることを除けば
C/C++ のルールとかなり似てるのでわかりやすいな。
(けどそれ故に C/C++ 的な考え方に引きずられてしまう部分もある……。)
そういうことか。
fat pointer を基礎に据えることを除けば
C/C++ のルールとかなり似てるのでわかりやすいな。
(けどそれ故に C/C++ 的な考え方に引きずられてしまう部分もある……。)
570デフォルトの名無しさん
2020/05/24(日) 20:09:44.60ID:sglBbUqv 言いたい事は理解できるが
存在できないって言い方は少し引っかかる
存在できないって言い方は少し引っかかる
571デフォルトの名無しさん
2020/05/24(日) 23:17:03.73ID:WFZqWDFu 6月号で特集が組まれてます
初心者の方は是非
初心者の方は是非
572デフォルトの名無しさん
2020/05/24(日) 23:36:35.12ID:a0LhMB8x なにこれどうなってるの?traitでFizzBuzz?
https://github.com/doctorn/trait-eval
https://github.com/doctorn/trait-eval
573デフォルトの名無しさん
2020/05/25(月) 09:27:38.21ID:Jp/r3UJz traitのFizzbuzzに付属してるtrait群がいいね。From実装してなくて爪甘いけど
574デフォルトの名無しさん
2020/05/25(月) 22:39:28.81ID:MNSExfZQ >>566
>[[[i32; 3]; 3]] は存在できるが
unsizedだからできない。
というか存在はしてる。rustはリージョンでメモリ管理するからコンパイル時に
リージョンのサイズが分かる必要があるからDSTが第一級じゃないだけ。
スライスにすればそのスライスのサイズはusize*2だからzoneを確保できるだろ。
コンパイル時にポインタのサイズが分かれば良いだけだから
assert_eq!(::std::alloc::Layout::new::<*const [u64]>(), ::std::alloc::Layout::new::<&[u64]>());
は通る。the bookとnomiconよめ。
>[[[i32; 3]; 3]] は存在できるが
unsizedだからできない。
というか存在はしてる。rustはリージョンでメモリ管理するからコンパイル時に
リージョンのサイズが分かる必要があるからDSTが第一級じゃないだけ。
スライスにすればそのスライスのサイズはusize*2だからzoneを確保できるだろ。
コンパイル時にポインタのサイズが分かれば良いだけだから
assert_eq!(::std::alloc::Layout::new::<*const [u64]>(), ::std::alloc::Layout::new::<&[u64]>());
は通る。the bookとnomiconよめ。
575デフォルトの名無しさん
2020/05/26(火) 01:25:10.52ID:zMnW+xpW576デフォルトの名無しさん
2020/05/26(火) 09:22:21.48ID:yWo2qZ2t577デフォルトの名無しさん
2020/05/26(火) 12:44:21.66ID:tQI2iyhC ::stdの指定の仕方ってなんで使うの?stdじゃなくて
自作のmod std作った時にしか被らないぐらいしか利点なさそう。しかもそんな紛らわしい名前で作らないし
自作のmod std作った時にしか被らないぐらいしか利点なさそう。しかもそんな紛らわしい名前で作らないし
578デフォルトの名無しさん
2020/05/26(火) 23:26:23.63ID:yWo2qZ2t 他の crate に公開するマクロで使う
579デフォルトの名無しさん
2020/05/26(火) 23:27:54.23ID:yWo2qZ2t std以外のcrateにも使えるから、モジュールとの名前かぶりで使わざるを得ないときもある
testとか
testとか
580デフォルトの名無しさん
2020/05/27(水) 10:28:00.44ID:dVIhbWpz 2018の次期バージョンっていくつ?
581デフォルトの名無しさん
2020/05/27(水) 11:01:45.48ID:pv32Gf/H >>580
Prepare for a possible Rust 2021 Edition
https://github.com/rust-lang/rfcs/blob/master/text/2857-roadmap-2020.md
Prepare for a possible Rust 2021 Edition
https://github.com/rust-lang/rfcs/blob/master/text/2857-roadmap-2020.md
582デフォルトの名無しさん
2020/05/28(木) 08:05:27.45ID:NpbhHX3L pub enum KansaiPref {
Osaka,
Hyogo,
Kyoto,
}
こういうenumを文字列から生成する時ってnewよりfrom_strで作った方がいいの?
impl KansaiPref {
fn new(s: &str) -> Self {
use Self::*;
match s {
"大阪" => Osaka,
"兵庫" => Hyogo,
"京都" => Kyoto,
_ => unimplemented!(),
}
}
newかfrom_str
impl FromStr for KansaiPref {
type Err = ...;
fn from_str(s: &str) -> Result<Self, Self::Err> {
use Self::*;
match s {
"大阪" => Osaka,
"兵庫" => Hyogo,
"京都" => Kyoto,
_ => unimplemented!(),
}
}
}
Osaka,
Hyogo,
Kyoto,
}
こういうenumを文字列から生成する時ってnewよりfrom_strで作った方がいいの?
impl KansaiPref {
fn new(s: &str) -> Self {
use Self::*;
match s {
"大阪" => Osaka,
"兵庫" => Hyogo,
"京都" => Kyoto,
_ => unimplemented!(),
}
}
newかfrom_str
impl FromStr for KansaiPref {
type Err = ...;
fn from_str(s: &str) -> Result<Self, Self::Err> {
use Self::*;
match s {
"大阪" => Osaka,
"兵庫" => Hyogo,
"京都" => Kyoto,
_ => unimplemented!(),
}
}
}
583デフォルトの名無しさん
2020/05/28(木) 10:15:20.06ID:Xow4Xb3r >>582
どっちでもいいと思うけど自分ならfrom_str選ぶ
理由はenumをnewするのにResult(かOption)が返されるシグニチャよりも
input.parse::<KansaiPref>()してResultが返されるほうが意図が伝わりやすいから
どっちでもいいと思うけど自分ならfrom_str選ぶ
理由はenumをnewするのにResult(かOption)が返されるシグニチャよりも
input.parse::<KansaiPref>()してResultが返されるほうが意図が伝わりやすいから
584デフォルトの名無しさん
2020/05/28(木) 12:26:13.92ID:XHarSIwj >>582
俺は初心者だから意見としてはそれほどあてにならないけど、
from_str を使った方がいいと思う。
new はただの習慣だが FromStr は制約として機能するので、
既存の枠組みの中で便利に機能する可能性がある。
俺は初心者だから意見としてはそれほどあてにならないけど、
from_str を使った方がいいと思う。
new はただの習慣だが FromStr は制約として機能するので、
既存の枠組みの中で便利に機能する可能性がある。
585デフォルトの名無しさん
2020/05/28(木) 22:03:56.44ID:85z31x28 多言語展開を考えるとどれも使いたくねえな…と思ってしまう
586デフォルトの名無しさん
2020/05/29(金) 07:36:25.48ID:RYu+vFRR FromStr実装するならちゃんと Err 返してくれ
587デフォルトの名無しさん
2020/05/29(金) 16:33:26.54ID:nAKVwuCz let a : Box<[T; 1000]> = Box::new([Default::default();1000]);
みたいなのってスタックに要素を作ってからヒープにコピーするようになるから効率が悪いし、
Copy を実装してない型だと使えないみたいなんだけど、これって今はどうするのが常套手段なの?
前提条件として変数の型は Box<[T; 1000]> というのは固定ということにして、
unsafe も避けられるものなら避けたい。
みたいなのってスタックに要素を作ってからヒープにコピーするようになるから効率が悪いし、
Copy を実装してない型だと使えないみたいなんだけど、これって今はどうするのが常套手段なの?
前提条件として変数の型は Box<[T; 1000]> というのは固定ということにして、
unsafe も避けられるものなら避けたい。
588デフォルトの名無しさん
2020/05/29(金) 17:24:59.34ID:lyhnjVvq >>587
vec![Default::default();1000].into_boxed_slice();
vec![Default::default();1000].into_boxed_slice();
589デフォルトの名無しさん
2020/05/29(金) 21:21:26.13ID:tZarZhzR >>586
標準でString or &str のパース失敗時に返すErrの型とかあんの?
標準でString or &str のパース失敗時に返すErrの型とかあんの?
590デフォルトの名無しさん
2020/05/30(土) 00:58:42.40ID:wj/8yI7A vec! と同じような使い勝手の box! があってもよさそうな気がするけど、
そういうクレートがあったりする?
そういうクレートがあったりする?
591デフォルトの名無しさん
2020/05/30(土) 01:42:01.99ID:tvhETOJ1 #![feature(box_syntax)]
let a: Box<[T; 1000]> = box [Default::default(); 1000];
https://github.com/rust-lang/rust/issues/53827
let a: Box<[T; 1000]> = box [Default::default(); 1000];
https://github.com/rust-lang/rust/issues/53827
592デフォルトの名無しさん
2020/05/30(土) 01:46:59.27ID:wj/8yI7A >>591
おおっ、これぞ私が必要としていたもの!
おおっ、これぞ私が必要としていたもの!
593デフォルトの名無しさん
2020/05/30(土) 07:24:57.35ID:DJ1cbMGZ594デフォルトの名無しさん
2020/05/30(土) 11:52:22.59ID:wj/8yI7A # と #! はどういう使い分けがあるの?
595デフォルトの名無しさん
2020/05/30(土) 13:01:17.39ID:QgJ1kT2w596デフォルトの名無しさん
2020/05/30(土) 15:53:27.03ID:wj/8yI7A >>595
Thx
Thx
597デフォルトの名無しさん
2020/06/01(月) 10:13:32.80ID:QCREwpDy loopとスレッドスリープでやるのもいいけど、いい感じにデーモン立てて一定時間経ったら関数実行してくれるような仕組みのクレートってない?
598デフォルトの名無しさん
2020/06/01(月) 10:31:33.62ID:o7IiynR8 借用や所有の概念って、Rustがはじめてなのかと思ったら、D言語に既にあったんだね。
599デフォルトの名無しさん
2020/06/01(月) 10:51:02.85ID:o7IiynR8 >>598
あー。D言語の方がRustを参考に取り入れたらしい。
あー。D言語の方がRustを参考に取り入れたらしい。
600デフォルトの名無しさん
2020/06/01(月) 11:12:31.20ID:o7IiynR8 Rustのヒープは必ず参照カウンタが入ってしまうので、C/C++言語に比べれば遅くなるね。
601デフォルトの名無しさん
2020/06/01(月) 11:19:51.79ID:dfhSq8hG602デフォルトの名無しさん
2020/06/01(月) 11:31:20.41ID:o7IiynR8 >>601
Box<T>も参照カウンタ入ってないの?
Box<T>も参照カウンタ入ってないの?
603デフォルトの名無しさん
2020/06/01(月) 11:32:01.43ID:o7IiynR8 >>601
それより、参照カウンタが入っているかどうかはどこを読めば分かるの?
それより、参照カウンタが入っているかどうかはどこを読めば分かるの?
604デフォルトの名無しさん
2020/06/01(月) 11:35:58.71ID:o7IiynR8 C++ vs Rust
unique_ptr<T> ---> Box<T>
shared_ptr<T> ---> Rc<T>
weak_ptr<T> ---> Weak<T>
ということなの?
どこに書いてある??
unique_ptr<T> ---> Box<T>
shared_ptr<T> ---> Rc<T>
weak_ptr<T> ---> Weak<T>
ということなの?
どこに書いてある??
605デフォルトの名無しさん
2020/06/01(月) 11:37:31.71ID:dfhSq8hG606デフォルトの名無しさん
2020/06/01(月) 11:40:30.85ID:o7IiynR8 let a = 7;
let a_box: Box<i32>
a_box = Box::new(a+2); //(3)
という例があったけど、どうして、(3)がエラーにならないの?
mut 属性にしておかなければ、let文でしか代入できないんじゃなかった?
let a_box: Box<i32>
a_box = Box::new(a+2); //(3)
という例があったけど、どうして、(3)がエラーにならないの?
mut 属性にしておかなければ、let文でしか代入できないんじゃなかった?
607デフォルトの名無しさん
2020/06/01(月) 11:43:34.61ID:dfhSq8hG >>604
https://doc.rust-jp.rs/book/second-edition/ch15-00-smart-pointers.html
>>606
a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
https://doc.rust-jp.rs/book/second-edition/ch15-00-smart-pointers.html
>>606
a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
608デフォルトの名無しさん
2020/06/01(月) 11:44:44.94ID:o7IiynR8609デフォルトの名無しさん
2020/06/01(月) 11:49:39.54ID:o7IiynR8 >>607
>a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
なるほど、最初かどうかをコンパイラが追跡していたんだね。
知らなかった。
immutableな変数は、必ず let 文でしか代入できないとばかり思っていた。
最初に読んだ documentでは、例としてそう書いてあったから。
>a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
なるほど、最初かどうかをコンパイラが追跡していたんだね。
知らなかった。
immutableな変数は、必ず let 文でしか代入できないとばかり思っていた。
最初に読んだ documentでは、例としてそう書いてあったから。
610デフォルトの名無しさん
2020/06/01(月) 11:51:23.94ID:dfhSq8hG >>608
厳密に同じかはわからないけど、対応としては合ってるかと。
厳密に同じかはわからないけど、対応としては合ってるかと。
611デフォルトの名無しさん
2020/06/01(月) 12:19:02.82ID:o7IiynR8 「変数のアドレスを他の変数に代入することを借用(borrowing)という」
という理解で有ってる?
という理解で有ってる?
612デフォルトの名無しさん
2020/06/01(月) 12:37:12.92ID:QCREwpDy ID: o7IiynR8
こいつやべーだろ。なんにも知らないくせにRustのヒープは必ず参照カウンタが入るとか嘘吹かしてんじゃねえか
蓋開けれみりゃ初心者のクレクレゴミだし、どういう自信で最初言ったんだよ
こいつやべーだろ。なんにも知らないくせにRustのヒープは必ず参照カウンタが入るとか嘘吹かしてんじゃねえか
蓋開けれみりゃ初心者のクレクレゴミだし、どういう自信で最初言ったんだよ
613デフォルトの名無しさん
2020/06/01(月) 12:37:39.24ID:0yVOdbpz >>611
実態はアドレスだが所有権管理の対象になるのはアドレスではなく参照。
実態はアドレスだが所有権管理の対象になるのはアドレスではなく参照。
614デフォルトの名無しさん
2020/06/01(月) 13:18:58.22ID:0yVOdbpz コンパイル時に所有権のチェックをしてるってのがよくわかってなくて変なことを言ってるのかもね。
「所有権の移動」が「実行時にアドレスと一緒に所有権が渡される」みたいな認識だとしたら
参照カウンタによって実装されるという ID:o7IiynR8 みたいな言説になるのはわからんでもない。
が、 Rust は静的解析の賢さでメモリの安全性を高めるのがウリのひとつなんだからそんなわけねーだろというくらいには
想像できて欲しいよ。
「所有権の移動」が「実行時にアドレスと一緒に所有権が渡される」みたいな認識だとしたら
参照カウンタによって実装されるという ID:o7IiynR8 みたいな言説になるのはわからんでもない。
が、 Rust は静的解析の賢さでメモリの安全性を高めるのがウリのひとつなんだからそんなわけねーだろというくらいには
想像できて欲しいよ。
615デフォルトの名無しさん
2020/06/01(月) 13:24:10.03ID:aguQ4xiv C++の概念に言い換えて理解しようというのが
そもそも無理筋な気が
そもそも無理筋な気が
616デフォルトの名無しさん
2020/06/01(月) 13:41:16.41ID:51GFkTZC 説明書読まずにとりあえず人に聞いて教えて貰おうとするやついるよね
617デフォルトの名無しさん
2020/06/01(月) 14:10:26.06ID:0yVOdbpz 所有権回りは Rust の重要な特徴だから
どんな入門書でも書いてないはずはないんだよな。
どんな入門書でも書いてないはずはないんだよな。
618デフォルトの名無しさん
2020/06/01(月) 14:47:28.60ID:w1nG+7Ec Rustの普及を阻む課題 年次調査から明らかに
https://www.atmarkit.co.jp/ait/articles/2006/01/news044.html
Rustの利用をやめた回答者にその理由を尋ねたところ「自社がRustを使っていない」という回答が最も多かった。
他の上位の理由は「習得が大変」「必要としているライブラリがない」「移行すると作業能率が落ちる」「IDE(統合開発環境)でのサポートが不十分」などだ。
Rustを利用したことがない回答者に理由を尋ねたところ、「Rustを学んだことがないから。ただし、学びたい」「自社がRustを使っていないから」という回答が、いずれも約4分の1の割合に達し、この2つで回答の過半数を占めた。
Rustの普及拡大への最大の課題として挙げた上位3つは、「トレーニング/ドキュメントの充実」「ライブラリの充実/改善」「IDEの統合」だ。
https://www.atmarkit.co.jp/ait/articles/2006/01/news044.html
Rustの利用をやめた回答者にその理由を尋ねたところ「自社がRustを使っていない」という回答が最も多かった。
他の上位の理由は「習得が大変」「必要としているライブラリがない」「移行すると作業能率が落ちる」「IDE(統合開発環境)でのサポートが不十分」などだ。
Rustを利用したことがない回答者に理由を尋ねたところ、「Rustを学んだことがないから。ただし、学びたい」「自社がRustを使っていないから」という回答が、いずれも約4分の1の割合に達し、この2つで回答の過半数を占めた。
Rustの普及拡大への最大の課題として挙げた上位3つは、「トレーニング/ドキュメントの充実」「ライブラリの充実/改善」「IDEの統合」だ。
619デフォルトの名無しさん
2020/06/01(月) 15:24:58.77ID:lLamlcG6620デフォルトの名無しさん
2020/06/01(月) 15:45:21.43ID:o7IiynR8 ちょっと変わった傾向だな:
55% of Rust users develop on Linux
24% develop on Windows
23% develop on macOS
55% of Rust users develop on Linux
24% develop on Windows
23% develop on macOS
621デフォルトの名無しさん
2020/06/01(月) 15:59:56.59ID:QCREwpDy 間違った知識を他人に教えるのは説明書読む以前の問題
622デフォルトの名無しさん
2020/06/01(月) 16:00:16.74ID:o7IiynR8 回答者がターゲットとしているプラットフォームも以下の様に書かれているが、回答者がWebBackendを職業にしている人が多いことに対応している可能性が高い :
Linux: 36.9%、
Windows: 16.3%、
maxOS: 14.7%
WebAssembly: 14.4%
Embedded: 7.6%
iOS: 2.9%
BSD: 2.7%
Android: 2.4%
When it comes to what platforms using are targeting for their applications Linux remains the first choice with 36.9%,with Windows as second at 16.3%.
Following close behind Windows are macOS and Web Assembly at 14% each
Linux: 36.9%、
Windows: 16.3%、
maxOS: 14.7%
WebAssembly: 14.4%
Embedded: 7.6%
iOS: 2.9%
BSD: 2.7%
Android: 2.4%
When it comes to what platforms using are targeting for their applications Linux remains the first choice with 36.9%,with Windows as second at 16.3%.
Following close behind Windows are macOS and Web Assembly at 14% each
623デフォルトの名無しさん
2020/06/01(月) 17:53:49.92ID:o7IiynR8 Some a = xxx; // 何か初期済みであると仮定
let b1 = Box::new(a);
let b2 = b1;
とした場合、b1が持っていた所有権はb2に移ってしまい、
b1はこれ以後使えなくなるという理解で有ってますか?
let b1 = Box::new(a);
let b2 = b1;
とした場合、b1が持っていた所有権はb2に移ってしまい、
b1はこれ以後使えなくなるという理解で有ってますか?
624デフォルトの名無しさん
2020/06/01(月) 18:03:59.31ID:o7IiynR8 初心者なもので、正しく(?)は、
let b1 = Box<Some>::new();
let b2 = b1;
なのかも知れません。
let b1 = Box<Some>::new();
let b2 = b1;
なのかも知れません。
625デフォルトの名無しさん
2020/06/01(月) 18:07:45.72ID:lLamlcG6 >>623
とりあえずThe Bookの所有権のところを一通り読んでから質問してください
その質問の答えも試し方も全部書いてますので
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html
とりあえずThe Bookの所有権のところを一通り読んでから質問してください
その質問の答えも試し方も全部書いてますので
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html
626デフォルトの名無しさん
2020/06/01(月) 18:23:13.55ID:o7IiynR8627デフォルトの名無しさん
2020/06/01(月) 18:36:04.96ID:0yVOdbpz >>623
お前が正しく理解してるかどうか知らんけど個別の事例として言えば Yes だ。
所有権は移動して、元の変数はもう使えない。
だけどそんなことはやってみたらわかりやすいエラーメッセージが出るじゃないの。
fn main() {
let a = 20;
let b1 = Box::new(a);
let b2 = b1;
println!("{}", b1);
}
みたいなことを書いたら
error[E0382]: use of moved value: `b1`
って出るし、どこでムーブ (所有権の移管) 済みかまでも表示してくれる。
Rust のエラーメッセージはめっちゃ親切なんだから、
「この場合はどうですか」なんて質問する間があったらやってみりゃいいんだよ。
お前が正しく理解してるかどうか知らんけど個別の事例として言えば Yes だ。
所有権は移動して、元の変数はもう使えない。
だけどそんなことはやってみたらわかりやすいエラーメッセージが出るじゃないの。
fn main() {
let a = 20;
let b1 = Box::new(a);
let b2 = b1;
println!("{}", b1);
}
みたいなことを書いたら
error[E0382]: use of moved value: `b1`
って出るし、どこでムーブ (所有権の移管) 済みかまでも表示してくれる。
Rust のエラーメッセージはめっちゃ親切なんだから、
「この場合はどうですか」なんて質問する間があったらやってみりゃいいんだよ。
628デフォルトの名無しさん
2020/06/01(月) 19:13:13.12ID:is4FQXAW Rustのエラーメッセージがすごく親切なのは分かるんだけど、小手先で直そうとするとどんどん修正範囲が広くなっていって最終的に「設計が悪い」みたいな結論になっちゃう
他言語よりコーディング時に考慮すべき点が多いというか違うというか…慣れればそういうことも無くなるのかね
他言語よりコーディング時に考慮すべき点が多いというか違うというか…慣れればそういうことも無くなるのかね
629デフォルトの名無しさん
2020/06/01(月) 22:13:40.55ID:o7IiynR8 >>628
色々調べてる途中だけど、どうも、C言語で出来ていたことの何割かは
Rustでは禁止されていて出来ないと思う。
https://stackoverflow.com/questions/40875152/reference-to-element-in-vector
を見てもRustではarrayの1つの要素に対する参照は作れないようだし。
C/C++では当然、そのようなものへの参照やポインタが好きなように作れる。
これが出来ないことである種の組み合わせ爆発が起こりがちになり、
C/C++よりプログラムがしにくくなるだろう。
色々調べてる途中だけど、どうも、C言語で出来ていたことの何割かは
Rustでは禁止されていて出来ないと思う。
https://stackoverflow.com/questions/40875152/reference-to-element-in-vector
を見てもRustではarrayの1つの要素に対する参照は作れないようだし。
C/C++では当然、そのようなものへの参照やポインタが好きなように作れる。
これが出来ないことである種の組み合わせ爆発が起こりがちになり、
C/C++よりプログラムがしにくくなるだろう。
630デフォルトの名無しさん
2020/06/01(月) 22:19:12.08ID:o7IiynR8 >>729
例えばの話、C言語だと1つのCPerson型のデータをファイルに出力する関数を
void write(FILE *fp, CPerson const *person);
のように作りさえすれば、
CPerson persons[100];
for (int idx=0; idx<100; idx++ ) {
write(fp, &persons[idx]);
}
でCPersonの配列にも対応できてしまう。
このようなことがRustではできなくなるはず。
無理やり観が有るが、CPersonのメンバ関数としてwrite()関数を作ってしまうことで対応できるかも知れない。
例えばの話、C言語だと1つのCPerson型のデータをファイルに出力する関数を
void write(FILE *fp, CPerson const *person);
のように作りさえすれば、
CPerson persons[100];
for (int idx=0; idx<100; idx++ ) {
write(fp, &persons[idx]);
}
でCPersonの配列にも対応できてしまう。
このようなことがRustではできなくなるはず。
無理やり観が有るが、CPersonのメンバ関数としてwrite()関数を作ってしまうことで対応できるかも知れない。
631デフォルトの名無しさん
2020/06/01(月) 22:50:56.49ID:CYB5du4X rustはまだ勉強中だけど、630がアホなこと言ってるのは俺でもわかる。
632デフォルトの名無しさん
2020/06/01(月) 22:53:23.54ID:6zq2VOrY ID:T0vrM+QLやID:bf1cRh+Bと同一人物だね
633デフォルトの名無しさん
2020/06/01(月) 22:54:16.92ID:6zq2VOrY 荒らしの相手するやつも荒らし
634デフォルトの名無しさん
2020/06/01(月) 23:37:56.02ID:QCREwpDy もうこのスレで公式すら読んでないような初心者質問するやつ無視でよくね。文章から見て同一人物っぽいし
それとそのテンプレ追加も次立てる人お願い >>999
それとそのテンプレ追加も次立てる人お願い >>999
635デフォルトの名無しさん
2020/06/02(火) 10:45:35.24ID:7ZgjbGq0636デフォルトの名無しさん
2020/06/02(火) 10:57:29.35ID:UmuMxSnR diesel辛いっていう人多いけど、乗り換えるならどんなクレートになんだろうね
637デフォルトの名無しさん
2020/06/02(火) 11:19:09.02ID:7ZgjbGq0638デフォルトの名無しさん
2020/06/02(火) 19:18:24.00ID:wGjSvc+B 結局c++やらんとrustを理解するなんて無理なんだよ
639デフォルトの名無しさん
2020/06/02(火) 20:16:57.29ID:N0F889O8640デフォルトの名無しさん
2020/06/03(水) 02:21:24.02ID:TdRUmxlv https://users.rust-lang.org/t/isnt-rust-too-difficult-to-be-widely-adopted/6173/37
↑のサイトに寄れば、Blandy & Orendorff の Programming Rust の
評判が良いらしい:
I’m also new to Rust and have found the “Programming Rust” book by Blandy & Orendorff to be very helpful.
Especially the chapters on ownership and references.
It is an expensive book though.
また、Box<T>, Rc<T>, RefCell<T>は必要ないという見方があるらしい。
最初から用意されているコンテナを使えば十分という意味のようだ :
I also didn’t need Box, Rc, RefCell, or friends.
↑のサイトに寄れば、Blandy & Orendorff の Programming Rust の
評判が良いらしい:
I’m also new to Rust and have found the “Programming Rust” book by Blandy & Orendorff to be very helpful.
Especially the chapters on ownership and references.
It is an expensive book though.
また、Box<T>, Rc<T>, RefCell<T>は必要ないという見方があるらしい。
最初から用意されているコンテナを使えば十分という意味のようだ :
I also didn’t need Box, Rc, RefCell, or friends.
641デフォルトの名無しさん
2020/06/03(水) 02:34:58.13ID:TdRUmxlv >>638
(C++は、C++11から大幅に改定されたので)、海外のサイトに寄れば、
C++11より前のC++からRustを学ぼうとすると大変だが、C++11以後
からだと対応関係が分かり易くて楽なのだそうだ。
unique_ptrとBox<T>が対応しているような話か。
ただ、C++の特徴であるtemplateに相当するものがまだRustにはないことが
残念だと書かれていた。
(C++は、C++11から大幅に改定されたので)、海外のサイトに寄れば、
C++11より前のC++からRustを学ぼうとすると大変だが、C++11以後
からだと対応関係が分かり易くて楽なのだそうだ。
unique_ptrとBox<T>が対応しているような話か。
ただ、C++の特徴であるtemplateに相当するものがまだRustにはないことが
残念だと書かれていた。
642デフォルトの名無しさん
2020/06/03(水) 02:45:19.00ID:TdRUmxlv そのサイトに寄れば、Rustで難しいのは、借用や所有の概念ではなく、
lifetimeなのだそうだ。
個人的にも、構造体のlifetimeについて説明不足を感じた。
構造体の変数のスコープと構造体のメタ部分で記述するライフタイムの
関係性がbookなどでは書かれて無いように思えた。
分からんけど。
lifetimeなのだそうだ。
個人的にも、構造体のlifetimeについて説明不足を感じた。
構造体の変数のスコープと構造体のメタ部分で記述するライフタイムの
関係性がbookなどでは書かれて無いように思えた。
分からんけど。
643デフォルトの名無しさん
2020/06/03(水) 02:59:40.24ID:TdRUmxlv 2018/04 の時点でも、まだ、lifetimeに関する資料が足りてないと感じている人がいたそうだ。
Can we maybe have a book or booklet exclusively covering lifetimes?
I don’t think the first level of instruction material on lifetimes which is found
in the rust book and others which talks about the syntax and the aliasing rules and elision is enough.
It leads to an incomplete model which only frustrates when you discover its incompleteness.
Rust nominoc does go further. For example it shows with detailed examples how lifetimes start with
a let binding and how they interact with other lifetimes in the same scope.
This is fundamental stuff and absolutely essential to understanding.
But there are still aspects not covered there.
For instance I realized that lifetimes can be shrunk as needed by the compiler only from this
forum (thanks @vitalyd) which invalidated my previous model.
And I’m sure there are other aspects I don’t know about.
I think we just need one place where one can learn everything about lifetimes and be done with it.
Can we maybe have a book or booklet exclusively covering lifetimes?
I don’t think the first level of instruction material on lifetimes which is found
in the rust book and others which talks about the syntax and the aliasing rules and elision is enough.
It leads to an incomplete model which only frustrates when you discover its incompleteness.
Rust nominoc does go further. For example it shows with detailed examples how lifetimes start with
a let binding and how they interact with other lifetimes in the same scope.
This is fundamental stuff and absolutely essential to understanding.
But there are still aspects not covered there.
For instance I realized that lifetimes can be shrunk as needed by the compiler only from this
forum (thanks @vitalyd) which invalidated my previous model.
And I’m sure there are other aspects I don’t know about.
I think we just need one place where one can learn everything about lifetimes and be done with it.
644デフォルトの名無しさん
2020/06/04(木) 10:31:48.72ID:E8yK5u0i >>641
グロ
グロ
645デフォルトの名無しさん
2020/06/04(木) 12:10:41.88ID:4kMLpsX6 >>636
sqlxじゃないか
sqlxじゃないか
646デフォルトの名無しさん
2020/06/04(木) 13:20:58.04ID:YCN7KCgu 難しいのはネストした場合のオブジェクトに対するイミュータブルかどうかとライフタイムだろう。
647デフォルトの名無しさん
2020/06/04(木) 14:06:07.27ID:hCECm/yf ライフタイムはコンパイラが親切丁寧に指摘してくれるから難しくは無いだろ
依存関係とか指摘出来ない系のエラーで詰まる事のが多い
依存関係とか指摘出来ない系のエラーで詰まる事のが多い
648デフォルトの名無しさん
2020/06/04(木) 19:40:21.91ID:pT22FhoL649デフォルトの名無しさん
2020/06/04(木) 20:10:09.15ID:pX62chi4 競馬かな?
650デフォルトの名無しさん
2020/06/04(木) 20:37:04.46ID:ZbgQHKA+ >>648
難しくないってのは「学習は」難しくないって話じゃね?
いずれは自分でわかるようになるというのは当然の前提で、
まあわかるようになっても間違えることはあるのでそれを指摘してくれるのもありがたい。
難しくないってのは「学習は」難しくないって話じゃね?
いずれは自分でわかるようになるというのは当然の前提で、
まあわかるようになっても間違えることはあるのでそれを指摘してくれるのもありがたい。
651デフォルトの名無しさん
2020/06/04(木) 22:06:35.88ID:x+eVDE0s >>650
ところが、コンパイラを実際に動かさなくても、仕様書や例を見ただけで
理解できる言語も多いんだよ。
たとえば、CやBASIC,JS,Java,C#,Ruby,Python,Perlなどがそれに該当する。
C++は、03まではまあ分かったが、だんだん難しくなっていった。
もはやSTLのソースも仕様書ですらも理解できるのは一部の特殊な人に
限定されてきているかも知れない。STLの
forward()の意味を理解したりどう実装されているかをソースを見て理解できる
る人は本の一握りだろう。
move()とforward()の役割の違いも実装レベルでどれだけの人間が理解できることか。
でもRustも同じように難しくて同じようなことは起こると考えている。
ところが、コンパイラを実際に動かさなくても、仕様書や例を見ただけで
理解できる言語も多いんだよ。
たとえば、CやBASIC,JS,Java,C#,Ruby,Python,Perlなどがそれに該当する。
C++は、03まではまあ分かったが、だんだん難しくなっていった。
もはやSTLのソースも仕様書ですらも理解できるのは一部の特殊な人に
限定されてきているかも知れない。STLの
forward()の意味を理解したりどう実装されているかをソースを見て理解できる
る人は本の一握りだろう。
move()とforward()の役割の違いも実装レベルでどれだけの人間が理解できることか。
でもRustも同じように難しくて同じようなことは起こると考えている。
652デフォルトの名無しさん
2020/06/04(木) 22:49:18.31ID:VyuaeUph そのレベルで理解できてない人がC++使うのはどういうメリットがあるのだろうか
653デフォルトの名無しさん
2020/06/04(木) 22:52:33.61ID:x+eVDE0s 実はC++は、forwardやmove, templateなどの詳細を理解できてなくても高級言語的な部分だけを使ってプログラムすることは出来る。
それはRustでも同じ。
それはRustでも同じ。
654デフォルトの名無しさん
2020/06/04(木) 23:01:33.43ID:iTcUmNL8 C++は仕様が難しいというより
仕様ではないけど当然知ってるべきイディオムが
たくさんあってきつい、という感じがするな。
仕様ではないけど当然知ってるべきイディオムが
たくさんあってきつい、という感じがするな。
655デフォルトの名無しさん
2020/06/05(金) 01:02:20.04ID:D80WdA6t 将棋しか知らない人が囲碁というゲームを見ると
何やってるかわからないしなんだかむずかしそうと言う
しかし実は囲碁はルールそのものはおそろしくシンプルなのだ
ところがルールだけ知っていても、囲碁は打てない
(打てるけど次に何していいかわからなくなる)
なぜなら囲碁はルールとは別に「こういう場面はこういう風に
打ち回す」というイデォムが大量にあってそれを知る必要があるからだ
C++はそれに似ている
何やってるかわからないしなんだかむずかしそうと言う
しかし実は囲碁はルールそのものはおそろしくシンプルなのだ
ところがルールだけ知っていても、囲碁は打てない
(打てるけど次に何していいかわからなくなる)
なぜなら囲碁はルールとは別に「こういう場面はこういう風に
打ち回す」というイデォムが大量にあってそれを知る必要があるからだ
C++はそれに似ている
656デフォルトの名無しさん
2020/06/05(金) 01:41:15.67ID:27EcDywu そもそもRustの仕様って難しいか?
いろんな言語から取り込んだ概念があって
C一筋とかRuby一筋みたいな人には学ぶべきことが多いとは思うけど、
特に複雑な仕様って思い当たらないんだけどな。
JSの型変換の仕様とかの方がよっぽど複雑だしワケわからんと思う。
いろんな言語から取り込んだ概念があって
C一筋とかRuby一筋みたいな人には学ぶべきことが多いとは思うけど、
特に複雑な仕様って思い当たらないんだけどな。
JSの型変換の仕様とかの方がよっぽど複雑だしワケわからんと思う。
657デフォルトの名無しさん
2020/06/05(金) 09:30:38.65ID:9qGH+5zI >>651
C が仕様や例で理解できるってどんな超人だよ。
コンパイルエラーにも実行時エラーにもならない未定義だの処理系定義だのが山もりだろうが。
初心者の書くコードで完全に仕様に沿ったコードなんて見たことないぞ。
C が仕様や例で理解できるってどんな超人だよ。
コンパイルエラーにも実行時エラーにもならない未定義だの処理系定義だのが山もりだろうが。
初心者の書くコードで完全に仕様に沿ったコードなんて見たことないぞ。
658デフォルトの名無しさん
2020/06/05(金) 09:38:30.26ID:9qGH+5zI Haskell の入門書を一通りは読んでたから Rust の型システムは似たようなものとして理解できたなぁ。
ライフタイムもプログラムの字面に書きこそしないでも C/C++ では意識せざるを得ないし、
複雑になるとわけわからんってときは C/C++ で書いてもわけわからんようになるやつ。
ライフタイムもプログラムの字面に書きこそしないでも C/C++ では意識せざるを得ないし、
複雑になるとわけわからんってときは C/C++ で書いてもわけわからんようになるやつ。
659デフォルトの名無しさん
2020/06/05(金) 12:01:32.43ID:lHXK6is7 きっとそういう感じでべた褒めする人が多いから、Rubyみたいに一回大人気言語になった後、急速に衰退する気がする。
Rubyも最初は良いと思われていた。
Rubyも最初は良いと思われていた。
660デフォルトの名無しさん
2020/06/05(金) 12:13:12.11ID:lHXK6is7661デフォルトの名無しさん
2020/06/05(金) 12:14:22.73ID:9qGH+5zI Ruby は今でも十分に使われているよ。 (俺は使ってないけど。)
適切ではないところまで広がった分がそぎ落とされてちょうどいい感じに落ち着いたってだけ。
プログラミング言語の良さはスカラ値で測定できるようなものではなくて、用途による。
利用事例が減ったからといってその勢いで衰退して消えるっていうような話ではない。
Rust はまだ実際のプロダクトでどう使うのが適切なのか見極め切れていないから過剰に広まっている
というのはあると思うが、少なくとも C/C++ で問題だった部分を解決したという側面はある。
そんでそのかわりに出てきた問題ももちろんあるので両方を天秤にかけて判断する材料を集めているとこって感じ。
適切ではないところまで広がった分がそぎ落とされてちょうどいい感じに落ち着いたってだけ。
プログラミング言語の良さはスカラ値で測定できるようなものではなくて、用途による。
利用事例が減ったからといってその勢いで衰退して消えるっていうような話ではない。
Rust はまだ実際のプロダクトでどう使うのが適切なのか見極め切れていないから過剰に広まっている
というのはあると思うが、少なくとも C/C++ で問題だった部分を解決したという側面はある。
そんでそのかわりに出てきた問題ももちろんあるので両方を天秤にかけて判断する材料を集めているとこって感じ。
662デフォルトの名無しさん
2020/06/05(金) 12:15:46.52ID:9qGH+5zI >>660
うん。 C がシンプルで理解しやすいと思い込みやすい言語なのは俺も知ってる。
うん。 C がシンプルで理解しやすいと思い込みやすい言語なのは俺も知ってる。
663デフォルトの名無しさん
2020/06/05(金) 12:32:15.42ID:lHXK6is7 Google Trends によれば、検索数の増加曲線はほぼ kotlinと同じ位。
ただし、kotlinは、2017/05に急激に上がってRustと重なりあった曲線になったのに対し、Rustは、2014/01に急激に上がった後、徐々に増えている感じ。
Rustはこの1年くらいでわずかに増加速度がKotlinより上がったが、それでもKotlinの曲線とほぼ重なった状態からは脱してはいない。
ただし、kotlinは、2017/05に急激に上がってRustと重なりあった曲線になったのに対し、Rustは、2014/01に急激に上がった後、徐々に増えている感じ。
Rustはこの1年くらいでわずかに増加速度がKotlinより上がったが、それでもKotlinの曲線とほぼ重なった状態からは脱してはいない。
664デフォルトの名無しさん
2020/06/05(金) 12:34:07.49ID:lHXK6is7 >>662
匿名性掲示板では何でも言えてしまうが、実績を見れば俺がちゃんとCやC++を使いこなしていることは分かる。
ただし、C++は一度学んでも仕様が大幅に変更されるので、細かいところを理解するのは時間が掛かるようになってきている。
Cはそんなことはなかったが。
匿名性掲示板では何でも言えてしまうが、実績を見れば俺がちゃんとCやC++を使いこなしていることは分かる。
ただし、C++は一度学んでも仕様が大幅に変更されるので、細かいところを理解するのは時間が掛かるようになってきている。
Cはそんなことはなかったが。
665デフォルトの名無しさん
2020/06/05(金) 12:58:47.64ID:AaIN4ymo もしかして伝説のスーパーハカーさんですか!?
666デフォルトの名無しさん
2020/06/05(金) 13:22:50.72ID:YL2P8Olu chronoつかってるんだけど、このyearってなんでi32なの?
https://docs.rs/chrono/0.4.11/chrono/offset/trait.TimeZone.html#method.ymd
fn ymd(&self, year: i32, month: u32, day: u32) -> Date<Self>
https://docs.rs/chrono/0.4.11/chrono/offset/trait.TimeZone.html#method.ymd
fn ymd(&self, year: i32, month: u32, day: u32) -> Date<Self>
667デフォルトの名無しさん
2020/06/05(金) 13:32:05.31ID:9qGH+5zI668デフォルトの名無しさん
2020/06/05(金) 13:35:12.28ID:9qGH+5zI669デフォルトの名無しさん
2020/06/05(金) 13:44:02.67ID:o7GNRsMO 合ってんじゃね?
知らんけど。
知らんけど。
670デフォルトの名無しさん
2020/06/05(金) 14:06:52.05ID:B8WhcAqO C++の仕様が大幅に変更されたというのは
なんのことだ?
なんのことだ?
671デフォルトの名無しさん
2020/06/05(金) 14:17:19.64ID:lHXK6is7 >>670
有る意味では僅かな修正であっても、基礎的な部分における修正は多大な影響を及ぼすことがある。
moveを出来るようにするために追加されたもろもろの事や、=を書かないタイプの{}
による初期化はそれに該当する。
なんでも無いようでいて、可読性を下げたり危険をもたらすことがある。
有る意味では僅かな修正であっても、基礎的な部分における修正は多大な影響を及ぼすことがある。
moveを出来るようにするために追加されたもろもろの事や、=を書かないタイプの{}
による初期化はそれに該当する。
なんでも無いようでいて、可読性を下げたり危険をもたらすことがある。
672デフォルトの名無しさん
2020/06/05(金) 14:41:22.49ID:rO0o1lhv >>662
Cほどシンプルな言語もないだろ。それと簡単に使いこなせるかは別問題。
Cほどシンプルな言語もないだろ。それと簡単に使いこなせるかは別問題。
673デフォルトの名無しさん
2020/06/05(金) 14:48:48.89ID:B8WhcAqO >>671
それ仕様の変更なの?
それ仕様の変更なの?
674デフォルトの名無しさん
2020/06/05(金) 14:55:26.22ID:vEUs2R05 >>666
そこに書いとるやん
This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
つまり-1は2 BC
そこに書いとるやん
This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.
つまり-1は2 BC
675デフォルトの名無しさん
2020/06/05(金) 15:08:35.22ID:8BtILZXI Cのプリプロセッサやパーサーを書くと全然シンプルじゃないことが分かる
676デフォルトの名無しさん
2020/06/05(金) 15:11:02.16ID:lHXK6is7 >>675
それは、使う側にはシンプルそうに見えるCも実は細かく見るとシンプルではないということであって、使う側目線で既に複雑なものはそれ以前の問題他。
それは、使う側にはシンプルそうに見えるCも実は細かく見るとシンプルではないということであって、使う側目線で既に複雑なものはそれ以前の問題他。
677デフォルトの名無しさん
2020/06/05(金) 15:43:45.14ID:9qGH+5zI 依存先より寿命が長くなってはいけないなんていうのは C でも当たり前のことだろ。
Rust のライフタイムはライフタイムを簡単に「表現 (したものをチェック)」する言語機能であって、
C でプログラマがやってる (はずの) ライフタイムの管理より複雑ということはない。
Rust なら処理系がチェックしてくれることを
C ではプログラマがやってたんだぞ。
C で出来てたことが Rust ではやれないってのは言語のせいか?
Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
複雑だとか学習難易度が高いというのは納得しかねる。
Rust のライフタイムはライフタイムを簡単に「表現 (したものをチェック)」する言語機能であって、
C でプログラマがやってる (はずの) ライフタイムの管理より複雑ということはない。
Rust なら処理系がチェックしてくれることを
C ではプログラマがやってたんだぞ。
C で出来てたことが Rust ではやれないってのは言語のせいか?
Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
複雑だとか学習難易度が高いというのは納得しかねる。
678デフォルトの名無しさん
2020/06/05(金) 15:54:02.73ID:lHXK6is7 >>677
>Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
>複雑だとか学習難易度が高いというのは納得しかねる。
一つあるとすれば、難しさは、ちゃんと本も読んでいるか、ネットに書かれている情報だけに頼っているかの違いに起因している可能性。
>Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
>複雑だとか学習難易度が高いというのは納得しかねる。
一つあるとすれば、難しさは、ちゃんと本も読んでいるか、ネットに書かれている情報だけに頼っているかの違いに起因している可能性。
679デフォルトの名無しさん
2020/06/05(金) 21:26:05.32ID:Py5zog1r これにて、このスレがRust関連の本の作者の巣窟であることが証明されました。
680デフォルトの名無しさん
2020/06/05(金) 21:32:24.36ID:cXh0Dvtv だいぶ前からじつは言語系のスレはほとんどソレなんだな
宣伝してるやつは気付かれれないと思ってるだろうけど
宣伝してるやつは気付かれれないと思ってるだろうけど
681デフォルトの名無しさん
2020/06/05(金) 21:49:15.38ID:Py5zog1r >>618
2018/11/28の時点で、
https://www.infoworld.com/article/3324488/rust-language-is-too-hard-to-learn-and-use-says-user-survey.html
ユーザーの調査によると、Rust言語は習得も使用も難しい
Rustユーザーの調査では、メモリの安全性と正確性のためにこの言語の非常に宣伝されている機能に困難と不満を感じています
Rust言語チームが実施したRustユーザーコミュニティの新しい調査では、言語とその使用への関心が高まっていますが、プロジェクトが利点として宣伝しているいくつかのRust機能に対するユーザーの不満も示されています。
Rustの習得が難しいのはなぜですか?ユーザーは、Rustの最も特徴的な2つの機能(寿命と所有権/借用システム)は、「トリッキー」、「非常に難しい」、または「まだ得られない」ものであると報告しました。
その他の質問は、Rustを続行するための課題を中心に展開されました。Rustの使用をやめた人の約半分は、わずか1か月後にそうしました。Rustを使用していない最も一般的な理由は、「威圧的すぎる、習得が難しい、または複雑すぎる」(25%)、
2018/11/28の時点で、
https://www.infoworld.com/article/3324488/rust-language-is-too-hard-to-learn-and-use-says-user-survey.html
ユーザーの調査によると、Rust言語は習得も使用も難しい
Rustユーザーの調査では、メモリの安全性と正確性のためにこの言語の非常に宣伝されている機能に困難と不満を感じています
Rust言語チームが実施したRustユーザーコミュニティの新しい調査では、言語とその使用への関心が高まっていますが、プロジェクトが利点として宣伝しているいくつかのRust機能に対するユーザーの不満も示されています。
Rustの習得が難しいのはなぜですか?ユーザーは、Rustの最も特徴的な2つの機能(寿命と所有権/借用システム)は、「トリッキー」、「非常に難しい」、または「まだ得られない」ものであると報告しました。
その他の質問は、Rustを続行するための課題を中心に展開されました。Rustの使用をやめた人の約半分は、わずか1か月後にそうしました。Rustを使用していない最も一般的な理由は、「威圧的すぎる、習得が難しい、または複雑すぎる」(25%)、
682デフォルトの名無しさん
2020/06/05(金) 22:00:56.76ID:Py5zog1r Rust言語は、学んだり使ったりするのが難しすぎるということが、ユーザーに対する調査で分かった。
--Rustユーザーに対する調査では、安全性と正確性のために言語が非常にうるさく押し付けてくる特長により困難と欲求不満を感じていることが分かった。
Rust language is too hard to learn and use, says user survey
A survey of Rust users finds difficulty and frustration with the language’s highly touted features for memory safety and correctness.
tout = 押し売りする, うるさく勧誘する, 客引きする
(tout for custom うるさく注文を求める.)
・切符をプレミア付きで売る, ダフ屋をやる.
・うるさく勧める.
・ほめちぎる.
--Rustユーザーに対する調査では、安全性と正確性のために言語が非常にうるさく押し付けてくる特長により困難と欲求不満を感じていることが分かった。
Rust language is too hard to learn and use, says user survey
A survey of Rust users finds difficulty and frustration with the language’s highly touted features for memory safety and correctness.
tout = 押し売りする, うるさく勧誘する, 客引きする
(tout for custom うるさく注文を求める.)
・切符をプレミア付きで売る, ダフ屋をやる.
・うるさく勧める.
・ほめちぎる.
683デフォルトの名無しさん
2020/06/05(金) 22:04:18.63ID:Py5zog1r 誤:安全性と正確性のために言語が非常にうるさく押し付けてくる特長
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる機構(機能)
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる機構(機能)
684デフォルトの名無しさん
2020/06/05(金) 23:15:24.59ID:9qGH+5zI >>674
へー。 西暦にゼロ年っていうのは無いのか。
へー。 西暦にゼロ年っていうのは無いのか。
685デフォルトの名無しさん
2020/06/06(土) 04:00:23.67ID:Vvt5YBJp この言語廃れてきそうな気がした。
だってみんなが触るって未来が想像できないもん
だってみんなが触るって未来が想像できないもん
686デフォルトの名無しさん
2020/06/06(土) 04:10:18.67ID:Oxqgflbz みんなが触る言語なんて世の中に存在するか?
687デフォルトの名無しさん
2020/06/06(土) 05:29:47.06ID:i8tpraSw Rustを使ったことはないけどC++は既存の資源で堅実に作るのに対して
Rustは一人のスーパープログラマが複雑高度なライブラリやモジュールを一点突破で書くのに使われそうなイメージ
Rustは一人のスーパープログラマが複雑高度なライブラリやモジュールを一点突破で書くのに使われそうなイメージ
688デフォルトの名無しさん
2020/06/06(土) 09:51:25.89ID:9F/1KVDa まあScalaと同じ道を辿るだろうね
あっちはビッグウェア系でそれなりに採用されてたから被害が甚大だったけど、
Rustに関してはそういうビジネス的な得意分野は今のところ無いのが救いか
あっちはビッグウェア系でそれなりに採用されてたから被害が甚大だったけど、
Rustに関してはそういうビジネス的な得意分野は今のところ無いのが救いか
689デフォルトの名無しさん
2020/06/06(土) 15:58:34.19ID:HBMrgMqa >>687
ところがスーパープログラマは、C++でもメモリー関連のバグで詰んで挫折したりすることはないんだな、これが。
ところがスーパープログラマは、C++でもメモリー関連のバグで詰んで挫折したりすることはないんだな、これが。
690デフォルトの名無しさん
2020/06/06(土) 17:06:05.01ID:58RXXUUu691デフォルトの名無しさん
2020/06/06(土) 17:17:15.77ID:P/b6XOwm C++は標準のライブラリリポジトリと標準のビルドツールがあればなぁ、と思う。
野良のは乱立してるけど、結局ほしいライブラリはなかったりするし…。
野良のは乱立してるけど、結局ほしいライブラリはなかったりするし…。
692デフォルトの名無しさん
2020/06/06(土) 17:37:45.92ID:wqdan8fc693デフォルトの名無しさん
2020/06/06(土) 18:11:03.05ID:58RXXUUu694デフォルトの名無しさん
2020/06/06(土) 18:38:18.22ID:Vvt5YBJp >>690
crates.ioがダメダメだから代替のサイトあるのってご存知でない?
crates.ioがダメダメだから代替のサイトあるのってご存知でない?
695デフォルトの名無しさん
2020/06/06(土) 18:42:21.81ID:nPYA670X Webサイトの話をしてるわけじゃないだろ
696デフォルトの名無しさん
2020/06/06(土) 18:56:38.50ID:7YMZq5d4 >>691
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
anyenv(rbenv)で、Ruby をコンパイルするのに、build-essential を使っているけど
build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています
パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
anyenv(rbenv)で、Ruby をコンパイルするのに、build-essential を使っているけど
build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています
パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
697デフォルトの名無しさん
2020/06/06(土) 19:37:13.44ID:P/b6XOwm698デフォルトの名無しさん
2020/06/06(土) 21:37:30.50ID:nFHIDUIo Rustでプロキシーサーバー実装してみようと思ったんだけどTCPStreamとreqwest::headerの連携がうまくいかない
699696
2020/06/06(土) 22:21:08.03ID:7YMZq5d4 漏れは、日本人が作った、バージョンマネージャーのanyenv で、
rbenv, nodenv を使って、ruby 2.6.6, node 12.16.2 を入れた
環境構築が、各言語でバラバラになるのは面倒なので、
anyenv・asdf などを使えば?
rbenv, nodenv を使って、ruby 2.6.6, node 12.16.2 を入れた
環境構築が、各言語でバラバラになるのは面倒なので、
anyenv・asdf などを使えば?
700デフォルトの名無しさん
2020/06/06(土) 23:04:13.04ID:nFHIDUIo hyperのサンプルに答えがありました
701デフォルトの名無しさん
2020/06/07(日) 00:03:49.64ID:uvQLWD0s こんな書き込みを見つけた:
loop {
// 1. you finally understood lifetimes
// 2. you get compiler lifetime /borrow complaints
// 3. you feel stupid for taking hours to fix <5 LoC
}
loop {
// 1. you finally understood lifetimes
// 2. you get compiler lifetime /borrow complaints
// 3. you feel stupid for taking hours to fix <5 LoC
}
702デフォルトの名無しさん
2020/06/07(日) 00:19:04.85ID:uvQLWD0s ループ {
// 1. あなたはついに lifetime を理解した。
// 2. あなたはコンパイラに lifetimeやborrow の苦情を複数個言われる。
// 3. 5行未満のコードを直すのに何時間もとられることにあなたは馬鹿馬鹿しさを感じる。
}
// 1. あなたはついに lifetime を理解した。
// 2. あなたはコンパイラに lifetimeやborrow の苦情を複数個言われる。
// 3. 5行未満のコードを直すのに何時間もとられることにあなたは馬鹿馬鹿しさを感じる。
}
703デフォルトの名無しさん
2020/06/07(日) 11:58:43.41ID:CPBtFfEp コンパイラに緊縛されて未定義動作を踏まないという快感を得るプレイ
704デフォルトの名無しさん
2020/06/07(日) 17:57:12.72ID:WIpxuhAg Rsutって、早い話が、CやC++に、NULLバグ等々が発生しないようにするための補助機能がついた言語ってこと?
705デフォルトの名無しさん
2020/06/07(日) 18:44:36.11ID:r/6oC92T そうだね〜、で、俺様はNullチェックは忘れないしダングリングポインタなんて組み込まないのでC/C++で良いや
という俺様スパハカがゴミグラムを生み出してきたのでRustは必須
という俺様スパハカがゴミグラムを生み出してきたのでRustは必須
706デフォルトの名無しさん
2020/06/07(日) 18:48:57.09ID:HzkE9Nko >>704
書き方がC/C++の文化とはかけ離れているように感じるが。
書き方がC/C++の文化とはかけ離れているように感じるが。
707デフォルトの名無しさん
2020/06/07(日) 19:46:37.12ID:WIpxuhAg708デフォルトの名無しさん
2020/06/07(日) 19:59:02.69ID:uZfe/Sta どっちかというと「関数型C++」な印象
709デフォルトの名無しさん
2020/06/07(日) 22:51:27.97ID:fhJ4vSsJ Hindley-Milner 型推論を元にしているから考え方は ML 系統からの影響は大きいと思う。
710デフォルトの名無しさん
2020/06/08(月) 02:06:14.90ID:jeqh3aBJ C++の地獄をML(とアフィン型)の知見で楽にしようとした言語
Cの遺産を引き摺ったが故に煩雑だった前者の記法を捨てて後者のいいとこを貰ってきたので、記法が後者に似てるように見えはするけど、やってる事はそう大きく変わってはいない
Cの遺産を引き摺ったが故に煩雑だった前者の記法を捨てて後者のいいとこを貰ってきたので、記法が後者に似てるように見えはするけど、やってる事はそう大きく変わってはいない
711デフォルトの名無しさん
2020/06/08(月) 10:53:34.76ID:KAmnJXdU 「C++ のメンバ関数の実態は this を暗黙に渡しているだけ」ってのを露骨にしたのも Rust の面白い部分だよね。
関数的な意味論を用いながらも構文糖としてのメソッド記法も用意することでオブジェクト指向的な表現が出来る。
関数的な意味論を用いながらも構文糖としてのメソッド記法も用意することでオブジェクト指向的な表現が出来る。
712デフォルトの名無しさん
2020/06/08(月) 13:11:59.47ID:LDYBA2kC RustはC++ではゼロコストで出来ていたものが、出来なくなってしまっていることが多い。
713デフォルトの名無しさん
2020/06/08(月) 13:14:25.82ID:KAmnJXdU >>712
具体的には?
具体的には?
714デフォルトの名無しさん
2020/06/08(月) 13:19:16.88ID:NanZmWBA 関数的な意味論ねぇ
表層的に一部それっぽいってだけでは?
表層的に一部それっぽいってだけでは?
715デフォルトの名無しさん
2020/06/08(月) 13:28:01.70ID:KAmnJXdU 言語として純粋関数型に分類される Haskell ですら
オブジェクト指向のスタイルで構築されたライブラリは有るから……。
(そのためのフレームワークである lens はまあまあ人気。)
言語仕様での理屈がどうあれ最終的には使い方次第。
オブジェクト指向のスタイルで構築されたライブラリは有るから……。
(そのためのフレームワークである lens はまあまあ人気。)
言語仕様での理屈がどうあれ最終的には使い方次第。
716デフォルトの名無しさん
2020/06/08(月) 13:36:41.82ID:LDYBA2kC >>713
言うと改善されるので言わない。
言うと改善されるので言わない。
717デフォルトの名無しさん
2020/06/08(月) 13:46:18.64ID:LDYBA2kC memmove()すらunsafeなしではかけないし。
718デフォルトの名無しさん
2020/06/08(月) 13:53:57.25ID:LDYBA2kC RustではpChildがHeapにとられている時、次のようなループすら書けない。
CPerson *pChild=pPerson->pChild;
while(pChild != NULL) {
(pChildに対する処理);
pChild=pChild->pNext;
}
CPerson *pChild=pPerson->pChild;
while(pChild != NULL) {
(pChildに対する処理);
pChild=pChild->pNext;
}
719デフォルトの名無しさん
2020/06/08(月) 14:30:52.23ID:KAmnJXdU >>718
こういう感じのこと?
#[derive(Default)]
struct Person {
pub childs: Box<[Person]>
}
fn main() {
let person : Person = Default::default();
let childs = person.childs;
for ref child in childs.iter() {
// child に対する処理
}
}
こういう感じのこと?
#[derive(Default)]
struct Person {
pub childs: Box<[Person]>
}
fn main() {
let person : Person = Default::default();
let childs = person.childs;
for ref child in childs.iter() {
// child に対する処理
}
}
720デフォルトの名無しさん
2020/06/08(月) 14:39:32.30ID:LDYBA2kC >>719
Heap領域にある構造体の中に、さらにHeap領域にあるデータへの
参照を持つためにBox型のメンバが有る場合、後者のBoxは、unique_ptrなので
ローカル変数にmoveすることができないためコンパイルエラーになる。
なので、参照カウント方式のRcを使う必要がある。
Heap領域にある構造体の中に、さらにHeap領域にあるデータへの
参照を持つためにBox型のメンバが有る場合、後者のBoxは、unique_ptrなので
ローカル変数にmoveすることができないためコンパイルエラーになる。
なので、参照カウント方式のRcを使う必要がある。
721デフォルトの名無しさん
2020/06/08(月) 14:44:31.30ID:LDYBA2kC722デフォルトの名無しさん
2020/06/08(月) 14:48:41.29ID:KAmnJXdU >>721
ならない。
(完)
ならない。
(完)
723デフォルトの名無しさん
2020/06/08(月) 14:53:38.92ID:faeMvMKI チュートリアルも読まない難癖おじいちゃんの相手すんなし
724デフォルトの名無しさん
2020/06/08(月) 14:56:15.14ID:LDYBA2kC そもそも、
struct Person {
pub child: Box<[Person]>
}
がおかしくて、正しくは、
struct Person {
pub child: Box<Person>
pub next: Box<Person>
}
だ。
struct Person {
pub child: Box<[Person]>
}
がおかしくて、正しくは、
struct Person {
pub child: Box<Person>
pub next: Box<Person>
}
だ。
725デフォルトの名無しさん
2020/06/08(月) 14:56:44.39ID:LDYBA2kC >>722
全く同じではないが、こっちの環境ではなったがな。
全く同じではないが、こっちの環境ではなったがな。
726デフォルトの名無しさん
2020/06/08(月) 14:58:43.87ID:KAmnJXdU 後付けやめろよ。
C++ のどういうコードを Rust でどう書けて欲しい (そして実際にはどういうエラーになる) のかちゃんと書け。
いや、書くな。 (どうせ見当違いなので。)
C++ のどういうコードを Rust でどう書けて欲しい (そして実際にはどういうエラーになる) のかちゃんと書け。
いや、書くな。 (どうせ見当違いなので。)
727デフォルトの名無しさん
2020/06/08(月) 15:03:12.27ID:LDYBA2kC >>725
#[derive(Debug)]
struct TAaa {
x: Box<i32>,
y: i32
}
fn main() {
let mut vec:Vec<TAaa> = Vec::new();
vec.push( TAaa {
x : Box::new(333),
y : 444
} );
let x = vec[0].x; // error[E0507]: cannot move out of index of `std::vec::Vec<TAaa>`
println!("{:#?}", x);
}
↑のように vec をHeapに確保した場合、エラーになる。
ところが、stackに確保した場合はエラーにならない。
実験済み。
#[derive(Debug)]
struct TAaa {
x: Box<i32>,
y: i32
}
fn main() {
let mut vec:Vec<TAaa> = Vec::new();
vec.push( TAaa {
x : Box::new(333),
y : 444
} );
let x = vec[0].x; // error[E0507]: cannot move out of index of `std::vec::Vec<TAaa>`
println!("{:#?}", x);
}
↑のように vec をHeapに確保した場合、エラーになる。
ところが、stackに確保した場合はエラーにならない。
実験済み。
728デフォルトの名無しさん
2020/06/08(月) 15:04:31.00ID:LDYBA2kC729デフォルトの名無しさん
2020/06/08(月) 15:16:36.76ID:LDYBA2kC730デフォルトの名無しさん
2020/06/08(月) 15:47:14.20ID:KAmnJXdU731デフォルトの名無しさん
2020/06/08(月) 16:43:05.54ID:LDYBA2kC >>730
>型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
>お前が結果的に違う条件で書いるだけ。
1.実験してみたところ、>>727でBoxをRcに変えてもエラーのままだった。
2.単純にTAaaをスタックに確保した場合、正常にコンパイルされた。
3.TAaaを以下のようにHeapに確保した場合も、正常にコンパイルされた:
fn main() {
let bbb = Box::new( TAaa {
x : Box::new(333),
y : 444
} );
println!( "bbb = {:#?}", bbb );
println!( "bbb.x = {:#?}", bbb.x );
println!( "let x = bbb.x;" );
let x = bbb.x;
println!( "x = {:#?}", x );
}
つまり、Vec<TAaa>の場合にだけエラーになる。
>型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
>お前が結果的に違う条件で書いるだけ。
1.実験してみたところ、>>727でBoxをRcに変えてもエラーのままだった。
2.単純にTAaaをスタックに確保した場合、正常にコンパイルされた。
3.TAaaを以下のようにHeapに確保した場合も、正常にコンパイルされた:
fn main() {
let bbb = Box::new( TAaa {
x : Box::new(333),
y : 444
} );
println!( "bbb = {:#?}", bbb );
println!( "bbb.x = {:#?}", bbb.x );
println!( "let x = bbb.x;" );
let x = bbb.x;
println!( "x = {:#?}", x );
}
つまり、Vec<TAaa>の場合にだけエラーになる。
732デフォルトの名無しさん
2020/06/08(月) 16:57:23.12ID:KAmnJXdU733デフォルトの名無しさん
2020/06/08(月) 17:21:28.18ID:LDYBA2kC734デフォルトの名無しさん
2020/06/08(月) 17:33:12.05ID:7lLHeGo6 rustじゃ書けないおじさんのコードを添削する流れ、何度目だ
735デフォルトの名無しさん
2020/06/08(月) 18:00:02.94ID:ZyH0cWN6 std::mem::take
736デフォルトの名無しさん
2020/06/08(月) 18:06:13.25ID:KAmnJXdU737デフォルトの名無しさん
2020/06/08(月) 18:15:14.24ID:OI3JiiYN ID真っ赤、お顔も真っ赤w
738デフォルトの名無しさん
2020/06/08(月) 18:20:45.97ID:KAmnJXdU >>734
ワイも初心者ではあるんよ。
The book (第二版の日本語訳の無料で読めるやつ) を読み終わって、試しに 500 行くらいのコードを書いてみたって程度。
本を読んでいる間はコードを書いてない。
手を動かすと理解しやすいという人も多いけど、
感覚でやってしまいがちで書いてある理屈をしっかり把握するのが疎かになる気がするから。
で、 The book を読めばこの程度には理解できるので理解できてないやつは単にアホという証明でもあるし、
逆に返答に詰るようなら俺がまだ入門級のことが理解できてない (どこが理解できていないか) ことがわかるので
練習の題材としてちょうどいいわという気持ちで相手してた。
ワイも初心者ではあるんよ。
The book (第二版の日本語訳の無料で読めるやつ) を読み終わって、試しに 500 行くらいのコードを書いてみたって程度。
本を読んでいる間はコードを書いてない。
手を動かすと理解しやすいという人も多いけど、
感覚でやってしまいがちで書いてある理屈をしっかり把握するのが疎かになる気がするから。
で、 The book を読めばこの程度には理解できるので理解できてないやつは単にアホという証明でもあるし、
逆に返答に詰るようなら俺がまだ入門級のことが理解できてない (どこが理解できていないか) ことがわかるので
練習の題材としてちょうどいいわという気持ちで相手してた。
739デフォルトの名無しさん
2020/06/08(月) 18:37:00.38ID:LDYBA2kC740デフォルトの名無しさん
2020/06/08(月) 21:16:08.81ID:KAmnJXdU >>739
let ref というのは直接的には The book に出てこないと思うけど、
let もパターンマッチだということはタプルの項目で示されている。
たとえば let a = &1; と書いたら a には 1 の参照が入るし、
let &a = &1; と書いたら a は (参照を経由する) 値になる。
参照にマッチするのではなく値にマッチさせた上で参照が欲しいときに使うのが
ref であるということは match の説明の中にある。
つまりこの場合に let ref x = vec[0].x; というのは
let x = &(vec[0].x); と書くのと理屈は同じ。
let ref というのは直接的には The book に出てこないと思うけど、
let もパターンマッチだということはタプルの項目で示されている。
たとえば let a = &1; と書いたら a には 1 の参照が入るし、
let &a = &1; と書いたら a は (参照を経由する) 値になる。
参照にマッチするのではなく値にマッチさせた上で参照が欲しいときに使うのが
ref であるということは match の説明の中にある。
つまりこの場合に let ref x = vec[0].x; というのは
let x = &(vec[0].x); と書くのと理屈は同じ。
741デフォルトの名無しさん
2020/06/08(月) 21:34:44.64ID:RC1s4U+D 公式で丁寧にしかも無料で公開されてる本もろくに読めないガイジたちがわらわらするスレになっちまったな
ちょっと名が知れ渡っただけでこんなことになんだから、一般的になったらとんでもないな
ちょっと名が知れ渡っただけでこんなことになんだから、一般的になったらとんでもないな
742デフォルトの名無しさん
2020/06/08(月) 22:57:09.22ID:42GeKV2i rust+wasmちょっとやってみたけど、単純な処理に記述だけが無駄に複雑になりすぎる
組み込みとかシステム系で使われそうだけど、一般的とか言う広く色々な使われ方はしないだろコレ
組み込みとかシステム系で使われそうだけど、一般的とか言う広く色々な使われ方はしないだろコレ
743デフォルトの名無しさん
2020/06/08(月) 23:32:06.17ID:RC1s4U+D JSみたいに直接DOM触れて、直接実行できるなら普及するけど、現状のめんどくささならなぁ・・・
744デフォルトの名無しさん
2020/06/09(火) 00:44:22.52ID:SETbyCsO >>740
それは分かっている。
iとjがループ内で変化したような場合、
vec[i].x
からmutableで借用した場合、
vec[j].x
からimmutableで借用できるかどうかの判定をコンパイラが一般的に行うのが難しいんだよ。
だからそのアルゴリズムを理解しているのかと聞いている。
それは分かっている。
iとjがループ内で変化したような場合、
vec[i].x
からmutableで借用した場合、
vec[j].x
からimmutableで借用できるかどうかの判定をコンパイラが一般的に行うのが難しいんだよ。
だからそのアルゴリズムを理解しているのかと聞いている。
745デフォルトの名無しさん
2020/06/09(火) 00:52:40.12ID:SETbyCsO >>744
似た例で言えば、
dst[i]をmutableで借用した場合、src[i]をimmutableで借用しようとしたときに、
srcとdstが同じアドレスに被って無いかの判定が静的には物凄く難しいと
されているので、エラーになってしまうかも知れないというようなことを心配
しているんだよ。
似た例で言えば、
dst[i]をmutableで借用した場合、src[i]をimmutableで借用しようとしたときに、
srcとdstが同じアドレスに被って無いかの判定が静的には物凄く難しいと
されているので、エラーになってしまうかも知れないというようなことを心配
しているんだよ。
746デフォルトの名無しさん
2020/06/09(火) 01:01:34.80ID:SETbyCsO >>745
もっとちゃんと書くと、
src[0]〜src[99]までに対して処理するような場合だと、src[i]をaに借用してから
f(a)、g(a)、h(a)に順番に渡して何か処理するようなことは出来ると思われるが、
ここに、dst[0]〜dst[99]も加わって、dst[j]をbにmutableで借用
しようとすると、mutableで借用した場合にimmutableでは借用できないというルールを
この場合にはコンパイラが静的には判断できなくなってコンパイル・エラーになって
しまう可能性を心配している。
つまり、コンパイルの借用チェッカは、予めよくあるパターンに対して特別な
処理を実装している場合には通るが、一般的には判断できるわけ無いので通らない
のではないかと考えられるんだよ。
もっとちゃんと書くと、
src[0]〜src[99]までに対して処理するような場合だと、src[i]をaに借用してから
f(a)、g(a)、h(a)に順番に渡して何か処理するようなことは出来ると思われるが、
ここに、dst[0]〜dst[99]も加わって、dst[j]をbにmutableで借用
しようとすると、mutableで借用した場合にimmutableでは借用できないというルールを
この場合にはコンパイラが静的には判断できなくなってコンパイル・エラーになって
しまう可能性を心配している。
つまり、コンパイルの借用チェッカは、予めよくあるパターンに対して特別な
処理を実装している場合には通るが、一般的には判断できるわけ無いので通らない
のではないかと考えられるんだよ。
747デフォルトの名無しさん
2020/06/09(火) 08:06:27.82ID:5kLCq/P0 このページに唐突にRustの話が出てくるのウケるな
https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML
https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML
748デフォルトの名無しさん
2020/06/09(火) 08:13:44.15ID:H8Y2HqIE let x = 5;
println!("{}", if 0 < x < 10 { "in" } else { "out" });
この比較方法ができない理由ってなんかある?例えば最適化に響く?とか
可読性も労力もこれ出来たほうがいいと思うんだけど
println!("{}", if 0 < x < 10 { "in" } else { "out" });
この比較方法ができない理由ってなんかある?例えば最適化に響く?とか
可読性も労力もこれ出来たほうがいいと思うんだけど
749デフォルトの名無しさん
2020/06/09(火) 10:15:42.01ID:DLyUUrRW 最初の比較でBoolになってんのを整数と比較してるからじぇね?
特に可読性が上がるとも思わないし、むしろ老眼で見逃す勢が出るから&&挟んだ方が見やすいな
特に可読性が上がるとも思わないし、むしろ老眼で見逃す勢が出るから&&挟んだ方が見やすいな
750デフォルトの名無しさん
2020/06/09(火) 10:25:43.24ID:ORTIF4By その書き方ができる言語は割と少数派な気がする
pythonではできるが
pythonではできるが
751デフォルトの名無しさん
2020/06/09(火) 10:40:14.84ID:0Ox9n+fW a < x > b
これを見て何がしたいのか直感的に理解できる人間は多数派ではないだろう
結局 lb < x < ub のパターンしか使わないんなら range で十分
これを見て何がしたいのか直感的に理解できる人間は多数派ではないだろう
結局 lb < x < ub のパターンしか使わないんなら range で十分
752デフォルトの名無しさん
2020/06/09(火) 10:58:25.83ID:hxMyXunA >>744-746
こういう感じの話? (※ 構造体を介する意味がないのでこの例では省略)
fn bar(vec: &mut Vec<usize>, i: usize, j: usize) {
let ref x = vec[i];
let ref mut y = vec[j]; // エラー
println!("{:#?} {:#?}", x, y);
}
fn main() {
let mut vec: Vec<usize> = vec![1, 2, 3];
bar(&mut vec, 0, 1);
}
vec の所有権が貸し出されるので一律に出来ない。
可能性を心配する必要はないよ。
普通の借用ルールが適用されて確実に出来ない。 (unsafe を使わない限り。)
こういう感じの話? (※ 構造体を介する意味がないのでこの例では省略)
fn bar(vec: &mut Vec<usize>, i: usize, j: usize) {
let ref x = vec[i];
let ref mut y = vec[j]; // エラー
println!("{:#?} {:#?}", x, y);
}
fn main() {
let mut vec: Vec<usize> = vec![1, 2, 3];
bar(&mut vec, 0, 1);
}
vec の所有権が貸し出されるので一律に出来ない。
可能性を心配する必要はないよ。
普通の借用ルールが適用されて確実に出来ない。 (unsafe を使わない限り。)
753デフォルトの名無しさん
2020/06/09(火) 13:10:15.38ID:wU3msb4d このスレで赤連投してんのこいつとこいつか???
https://twitter.com/YutakaAoki3
https://twitter.com/SFITB
https://twitter.com/5chan_nel (5ch newer account)
https://twitter.com/YutakaAoki3
https://twitter.com/SFITB
https://twitter.com/5chan_nel (5ch newer account)
754デフォルトの名無しさん
2020/06/09(火) 14:37:23.22ID:H8Y2HqIE しかもそいつら繋がってんのな、Rust大嫌いなのに隠してここでやりとりしてんのな
とりあえず二人とも気持ち悪いからミュート、ブロックした
https://qiita.com/Yutaka_Aoki
https://qiita.com/SFITB
とりあえず二人とも気持ち悪いからミュート、ブロックした
https://qiita.com/Yutaka_Aoki
https://qiita.com/SFITB
755デフォルトの名無しさん
2020/06/09(火) 14:41:22.18ID:1+p+UWLN ここはrust信者しか書き込んだらいかんらしい
756デフォルトの名無しさん
2020/06/09(火) 15:07:39.63ID:FNvqfpCR 少なくともMozillaのステマが〜とか言ってた頃よりだいぶましだと思うが。
757デフォルトの名無しさん
2020/06/09(火) 15:54:45.21ID:1XBt8hKf えぇ
どっから特定されたの
どっから特定されたの
758デフォルトの名無しさん
2020/06/09(火) 19:23:53.82ID:9Q2vOhVs dropが飴玉みたいって批判?がちょっと面白かった。
その発想はなかった的な。
その発想はなかった的な。
759デフォルトの名無しさん
2020/06/09(火) 20:40:17.08ID:hxMyXunA drop out とか drop off とかのニュアンスでしょ?
スコープから消えろという意味での drop であって、結果的に解体もするというのは実装側の都合だよな。
その型を利用する側の都合からするとただ消えろって話なので、drop という語をあてるのは Rust 的にはそこそこ妥当な選択だと思える。
やることが同じだから同じというのは抽象化を軽視する暴論だ。
スコープから消えろという意味での drop であって、結果的に解体もするというのは実装側の都合だよな。
その型を利用する側の都合からするとただ消えろって話なので、drop という語をあてるのは Rust 的にはそこそこ妥当な選択だと思える。
やることが同じだから同じというのは抽象化を軽視する暴論だ。
760デフォルトの名無しさん
2020/06/09(火) 23:30:17.61ID:dBtT67N+ linuxカーネルでキャッシュをドロップする、みたいなのが用法としては近いのかな。
761デフォルトの名無しさん
2020/06/10(水) 01:57:37.96ID:EI8iQv9S >>756
https://twitter.com/YutakaAoki3/status/1270069950581858309
同一人物説
dropって命名はかなり絶妙だと思う。
時点でscoped outから取ってoutとかがいいと思うけど、outだけだと抽象的すぎるからdropが一番いい
https://twitter.com/5chan_nel (5ch newer account)
https://twitter.com/YutakaAoki3/status/1270069950581858309
同一人物説
dropって命名はかなり絶妙だと思う。
時点でscoped outから取ってoutとかがいいと思うけど、outだけだと抽象的すぎるからdropが一番いい
https://twitter.com/5chan_nel (5ch newer account)
762デフォルトの名無しさん
2020/06/10(水) 02:51:12.39ID:Zbkl4OJ9 そもそもdropって表現使ってる言語なんかなかったっけ??
763デフォルトの名無しさん
2020/06/10(水) 08:25:50.22ID:uVgELRDi ネイティブが決めた名前をJapsが文句言うのは流石に草
764デフォルトの名無しさん
2020/06/10(水) 09:37:48.27ID:2ezYpnf+ 実際にプログラミングするのは英語話者ばかりではないので
既に浸透した用語を使って欲しいというのはわからんでもないんだが、
似て非なるものに同じ名前を与えると調べにくかったりすることもあるしなぁ。
他の言語からの「移行」という視線でばかり見ていると良くなった部分も移行コストに見えてしまうんだなというのはわかった。
既に浸透した用語を使って欲しいというのはわからんでもないんだが、
似て非なるものに同じ名前を与えると調べにくかったりすることもあるしなぁ。
他の言語からの「移行」という視線でばかり見ていると良くなった部分も移行コストに見えてしまうんだなというのはわかった。
765デフォルトの名無しさん
2020/06/10(水) 10:10:31.54ID:XLjKTHkb そもそもdropについて言えば既存の言語でも
free, delete, dispose, finalizeとバラバラなので
浸透もクソもない。
free, delete, dispose, finalizeとバラバラなので
浸透もクソもない。
766デフォルトの名無しさん
2020/06/10(水) 10:24:08.29ID:2ezYpnf+ それぞれの用語の大まかな使い分けはあるけども、
じゃあ drop がそのどれかに当てはまるかといえば当てはまらないし。
じゃあ drop がそのどれかに当てはまるかといえば当てはまらないし。
767デフォルトの名無しさん
2020/06/10(水) 12:27:01.09ID:wKk8b9p0 qiitaの記事数は、Rustに対し、Goが8倍、Kotlinが1.5倍、C++が50倍、Javaが16倍。
唯一、Haskelに対しては、Rustは、100倍以上の記事数がある。
唯一、Haskelに対しては、Rustは、100倍以上の記事数がある。
768デフォルトの名無しさん
2020/06/10(水) 18:15:57.47ID:2ezYpnf+ >>767
それがどしたんや
それがどしたんや
769デフォルトの名無しさん
2020/06/10(水) 18:22:57.35ID:eINpUyJE Haskelは触ったことのある人数で言えばRustよりずっと多いだろうけど、マサカリが怖くて記事書きづらいんだろう
770デフォルトの名無しさん
2020/06/10(水) 23:07:45.91ID:7cbxIbSc まず FireFox 表記をやめろ
771デフォルトの名無しさん
2020/06/11(木) 05:09:15.88ID:LlBqG++A 宣言型マクロでRustの処理書けない理由ってある?
今のパターンマッチ風構文で作ったから処理文入れるところがない的な?
今のパターンマッチ風構文で作ったから処理文入れるところがない的な?
772デフォルトの名無しさん
2020/06/11(木) 14:25:13.16ID:5qmGy9Sy 「Rust」はなぜ人気があるのか、Stack Overflowがユーザーのコメントを紹介
https://www.atmarkit.co.jp/ait/articles/2006/11/news051.html
https://www.atmarkit.co.jp/ait/articles/2006/11/news051.html
773デフォルトの名無しさん
2020/06/11(木) 15:19:33.86ID:EKtCO5aX ガチ関数型と違って難しいポイントはただ複雑なだけなので、頭悪くても慣れさえすればマウンティングしやすいのが人気の理由だと思ってる
774デフォルトの名無しさん
2020/06/11(木) 17:27:55.76ID:Th6rh/3U 「一番愛する言語」と聞かれたら、C++もC#もJSもPythonも全面的に好きで
使ってるわけではないから、消去法でRustを選ぶしかない。
そもそも愛すべき言語なんて一般人にはあるわけ無いし。
Rustだったら「愛すべき」と公表しても馬鹿にされないで済むみたいな。
他のどの言語を選んでも、白い目で見られそうだから。
使ってるわけではないから、消去法でRustを選ぶしかない。
そもそも愛すべき言語なんて一般人にはあるわけ無いし。
Rustだったら「愛すべき」と公表しても馬鹿にされないで済むみたいな。
他のどの言語を選んでも、白い目で見られそうだから。
775587
2020/06/11(木) 17:33:10.59ID:7wv0rqaB ドキュメントを眺めてたら >>587 は Nightly ではこんな感じで書けるかなって思った。
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=75b0cca2f785445e707b113c1bce3b55
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=75b0cca2f785445e707b113c1bce3b55
776デフォルトの名無しさん
2020/06/11(木) 17:43:19.49ID:VpmD2Oc5 >>774
SOのサーベイのことをいってるなら、あれは別に「愛する言語は何ですか?」というアンケートではないので「愛する」と日本語で考えてもあまり意味ないぞ。
いまRustを使っていて今後も使い続けたいですか?という質問の集計結果をmost loved languageと表現してるだけ。
だから仕事で(嫌々でも)使わざるを得ない言語は低く出るし、Rustみたいに趣味で選んでる言語は高く出るのだろう。
SOのサーベイのことをいってるなら、あれは別に「愛する言語は何ですか?」というアンケートではないので「愛する」と日本語で考えてもあまり意味ないぞ。
いまRustを使っていて今後も使い続けたいですか?という質問の集計結果をmost loved languageと表現してるだけ。
だから仕事で(嫌々でも)使わざるを得ない言語は低く出るし、Rustみたいに趣味で選んでる言語は高く出るのだろう。
777デフォルトの名無しさん
2020/06/11(木) 22:59:22.90ID:Th6rh/3U >>776
Rustを愛すると答えた人でも、 使っている人は5%程度しかいないと書いてあったから、
「いまRustを使っていて今後も使い続けたいですか?という質問の集計結果」
とは違うはずだ。
使って無い人も「好き」と言えた訳だから。
Rustを愛すると答えた人でも、 使っている人は5%程度しかいないと書いてあったから、
「いまRustを使っていて今後も使い続けたいですか?という質問の集計結果」
とは違うはずだ。
使って無い人も「好き」と言えた訳だから。
778デフォルトの名無しさん
2020/06/11(木) 23:08:36.19ID:lDcKCiP3 >>777
ちょっと正確な質問は忘れたけど、
問1 最近よく使う言語はなんですか?
問2 その言語を今後も使い続けたいですか?
みたいな質問で、1でRustと答えた人の86%が2でyesと答えたって話。
(で、その86%ってのが全言語で1位だった)
なので5%の人しか使ってないというのとは別に矛盾しないし、
Rustを使ってない人の意見はそもそも反映されない。
ちょっと正確な質問は忘れたけど、
問1 最近よく使う言語はなんですか?
問2 その言語を今後も使い続けたいですか?
みたいな質問で、1でRustと答えた人の86%が2でyesと答えたって話。
(で、その86%ってのが全言語で1位だった)
なので5%の人しか使ってないというのとは別に矛盾しないし、
Rustを使ってない人の意見はそもそも反映されない。
779デフォルトの名無しさん
2020/06/11(木) 23:14:58.90ID:lDcKCiP3 このあたり元のアンケートに答えた人や
SOのレポートを隅々まで読んだ人なら分かるんだけど
ニュースサイトの伝言ゲームで「最も人気のある言語」とかになってしまうと
ものすごく語弊があるんだよな。
SOのレポートを隅々まで読んだ人なら分かるんだけど
ニュースサイトの伝言ゲームで「最も人気のある言語」とかになってしまうと
ものすごく語弊があるんだよな。
780デフォルトの名無しさん
2020/06/11(木) 23:41:02.95ID:Th6rh/3U781デフォルトの名無しさん
2020/06/11(木) 23:47:20.09ID:lDcKCiP3 >>780
使ってる人が5%というのは合ってて、
その5%のうちの86%が今後も使いたいってこと。
だからRustを好きな人が多いんじゃなくて、好きな人の割合が高いというだけ。
実際に好きな人の絶対数でいけば、ユーザーの多いPythonとかが圧勝だと思う。
使ってる人が5%というのは合ってて、
その5%のうちの86%が今後も使いたいってこと。
だからRustを好きな人が多いんじゃなくて、好きな人の割合が高いというだけ。
実際に好きな人の絶対数でいけば、ユーザーの多いPythonとかが圧勝だと思う。
782デフォルトの名無しさん
2020/06/11(木) 23:51:33.67ID:Th6rh/3U >>781
あなたはもしかして数学苦手ですか?
あなたはもしかして数学苦手ですか?
783デフォルトの名無しさん
2020/06/12(金) 02:00:09.52ID:3QRVSzSK >>775
Default::default() が panic したときに drop で未初期化領域アクセスして UB になりそう
Default::default() が panic したときに drop で未初期化領域アクセスして UB になりそう
785デフォルトの名無しさん
2020/06/12(金) 20:41:45.45ID:3QRVSzSK786デフォルトの名無しさん
2020/06/12(金) 22:06:49.25ID:ROT3upn7 要素がMaybeUninitなので未初期化領域にアクセスすることはないだろうけど、逆に初期化済みの領域が解放されずに残るような?
787587
2020/06/12(金) 22:21:06.94ID:Du26dNpG >>786
panic したときのことなので UB でさえなければメモリが解放されないのは問題にならないと思いますが。
panic したときのことなので UB でさえなければメモリが解放されないのは問題にならないと思いますが。
788デフォルトの名無しさん
2020/06/12(金) 22:37:53.36ID:dTuswZtd copylessっつうcrateがあるからそれ使うか参考にするといいかもよ
789デフォルトの名無しさん
2020/06/13(土) 09:06:43.07ID:4a9xUc1f >>783
Default::default() が panic起こす実装してるからUB以前にそこを直すべきだと思うけど違う?
Default::default() が panic起こす実装してるからUB以前にそこを直すべきだと思うけど違う?
790デフォルトの名無しさん
2020/06/14(日) 08:51:59.74ID:GVwShxqI playgroundで手続きマクロ書きたいんだけど
#![crate_type="proc-macro"]
で出来なくてCargo.tomlも触れないから変更出来ないんだけどどうやっても触れない??
#![crate_type="proc-macro"]
で出来なくてCargo.tomlも触れないから変更出来ないんだけどどうやっても触れない??
791デフォルトの名無しさん
2020/06/16(火) 19:24:13.66ID:BP9MVREP 弱参照を多用する人っていないの?unsafeが基本?
792デフォルトの名無しさん
2020/06/18(木) 05:25:57.31ID:K1rCi1si793デフォルトの名無しさん
2020/06/21(日) 01:44:24.45ID:KswBNjV4 こういうコードを書いててどこを直せばいいかわかんないので教えてーー
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4ce583191e5b07279b8ec65ef5198456
AddAssign の型引数のところに与えてるライフタイムがおかしいとは思うんだけど、
どう直せばいいかわかんない。
この書き方だと += の左辺以上の寿命を右辺が持ってるという意味になるの?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4ce583191e5b07279b8ec65ef5198456
AddAssign の型引数のところに与えてるライフタイムがおかしいとは思うんだけど、
どう直せばいいかわかんない。
この書き方だと += の左辺以上の寿命を右辺が持ってるという意味になるの?
794デフォルトの名無しさん
2020/06/21(日) 20:32:40.47ID:pHqBLLSo あんまり詳しくないけど、ライフタイムのその書き方でエラーなるってバグじゃない?(推論力の問題?)
個人的に気になるから詳しい人教えて欲しいな
一応これで治るけど
impl<T: AddAssign<T> + From<usize> + Clone> Iterator for Fibonacci<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
swap(&mut self.f0, &mut self.f1);
self.f1 += self.f0.clone();
Some(self.f0.clone())
}
}
個人的に気になるから詳しい人教えて欲しいな
一応これで治るけど
impl<T: AddAssign<T> + From<usize> + Clone> Iterator for Fibonacci<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
swap(&mut self.f0, &mut self.f1);
self.f1 += self.f0.clone();
Some(self.f0.clone())
}
}
795793
2020/06/21(日) 21:05:29.71ID:KswBNjV4 デフォルトで usize を基礎に据えているんですが、 BigUint なども効率的に扱いたいので
clone はなるべく少なくしたいという意図で参照で受け取る AddAssign を前提にしたいんですよね……。
clone はなるべく少なくしたいという意図で参照で受け取る AddAssign を前提にしたいんですよね……。
796デフォルトの名無しさん
2020/06/21(日) 22:00:26.97ID:T8Yrab8u >>793
これでどう?
impl<T> Iterator for Fibonacci<T>
where
T: From<usize> + Clone,
T: for<'a> AddAssign<&'a T>
これでどう?
impl<T> Iterator for Fibonacci<T>
where
T: From<usize> + Clone,
T: for<'a> AddAssign<&'a T>
797793
2020/06/21(日) 22:48:41.52ID:KswBNjV4 >>796
期待通り動きました!
for の使い方について調べたところこのへんにあるのを見つけたのですが、
どうにもはっきりとは理解できてないです。
https://doc.rust-lang.org/nomicon/hrtb.html
AddAssign が必要とされる個別の場面まで寿命の推測を遅らせるみたいな感じですかね?
期待通り動きました!
for の使い方について調べたところこのへんにあるのを見つけたのですが、
どうにもはっきりとは理解できてないです。
https://doc.rust-lang.org/nomicon/hrtb.html
AddAssign が必要とされる個別の場面まで寿命の推測を遅らせるみたいな感じですかね?
799793
2020/06/22(月) 00:26:04.06ID:H8+bL0cM なんか見覚えある気がすると思って考えてたんだけど、
Haskell の forall と似てるんだな。
>>793 だと Fibonacci<T> の T の制約として解釈されてしまうから、
'a は Fibonacci<T> と同じ寿命ってことになっちゃうわけか。
Haskell の forall と似てるんだな。
>>793 だと Fibonacci<T> の T の制約として解釈されてしまうから、
'a は Fibonacci<T> と同じ寿命ってことになっちゃうわけか。
800デフォルトの名無しさん
2020/06/23(火) 23:09:33.48ID:ImTRmBX4 あるフォルダーに入っているファイルをWeb経由で見れるようにしたいのだがそういったことができるクレートあったりしますか?
現在Actix+teraで実装しようと考えていますがなかなかうまくいかないので・・・
現在Actix+teraで実装しようと考えていますがなかなかうまくいかないので・・・
801デフォルトの名無しさん
2020/06/24(水) 02:24:42.93ID:ak6DHXg2 python3 -m http.server 8000
802デフォルトの名無しさん
2020/06/24(水) 03:07:05.31ID:tDxYjRXk actix-webとactix-filesではだめなの
803デフォルトの名無しさん
2020/06/24(水) 03:37:50.70ID:rM4tv+8j Ruby なら、コマンドプロンプト・PowerShell から、1-liner で、
Rubyで作られた遅いウェブサーバー、WEBrick が起動する
ruby -run -e httpd . -p 8080
そのフォルダに、index.html があれば、これでブラウザからアクセスできる
http://localhost:8080
Rubyで作られた遅いウェブサーバー、WEBrick が起動する
ruby -run -e httpd . -p 8080
そのフォルダに、index.html があれば、これでブラウザからアクセスできる
http://localhost:8080
804デフォルトの名無しさん
2020/06/24(水) 10:36:40.30ID:l/oN1z1j >>803
rustのスレまで出張ってくるなよジジイ
rustのスレまで出張ってくるなよジジイ
805デフォルトの名無しさん
2020/06/24(水) 12:04:47.26ID:4T6/LA8J なぜrustでactix+tera を使いたいのか
学習目的?
学習目的?
806デフォルトの名無しさん
2020/06/24(水) 13:42:57.67ID:zkd3Aeky そういや、actixの作者がやる気なくしてた問題は解決したの?
807デフォルトの名無しさん
2020/06/24(水) 14:34:48.81ID:rnWT6W+j あの「とほほのWWW入門」に「Rust」と「Go言語」の入門コンテンツ追加へ【やじうまWatch】 - INTERNET Watch
https://internet.watch.impress.co.jp/docs/yajiuma/1260986.html
このサイトまだあったんだな
https://internet.watch.impress.co.jp/docs/yajiuma/1260986.html
このサイトまだあったんだな
808デフォルトの名無しさん
2020/06/24(水) 19:37:44.39ID:hh4NKeEg809デフォルトの名無しさん
2020/06/25(木) 18:06:43.52ID:8MiElZj2 warpがおすすめ
810デフォルトの名無しさん
2020/06/26(金) 04:24:36.46ID:rzSuBmAQ この前作ったツールではrouilleを使った
CLIツールにおまけのWeb UIを付けるため
シンプルで良かった
CLIツールにおまけのWeb UIを付けるため
シンプルで良かった
811デフォルトの名無しさん
2020/06/29(月) 22:50:20.59ID:1itP0QVJ アプリケーションの設定を管理するようなライブラリで変更時に知らせてくれるような機能があるのってgioクレートのSettings以外になんかありませんか?
812デフォルトの名無しさん
2020/06/30(火) 15:14:43.19ID:oMNW4x3G const fn b(s: &'static str) -> usize {
s.len()
}
fn a(s: &'static str) -> usize {
b(s)
}
a("c");
const fn のこの例ってこの下に置き換えられる?
それともaがconstじゃないから置き換わらない?
fn a(s: &'static str) -> usize {
1
}
s.len()
}
fn a(s: &'static str) -> usize {
b(s)
}
a("c");
const fn のこの例ってこの下に置き換えられる?
それともaがconstじゃないから置き換わらない?
fn a(s: &'static str) -> usize {
1
}
813デフォルトの名無しさん
2020/06/30(火) 17:20:04.74ID:SQ1ey2jp814デフォルトの名無しさん
2020/06/30(火) 20:47:08.92ID:oMNW4x3G >>813
じゃあハッシュテーブルとかのキー定数とかもコンパイル時にハッシュになってるの?
じゃあハッシュテーブルとかのキー定数とかもコンパイル時にハッシュになってるの?
815デフォルトの名無しさん
2020/07/01(水) 01:46:25.16ID:0X9xkDpt ハッシュ値の生成に乱数使ってるからコンパイル時には決定できないはず
const fn な hasher が仮に存在するならハッシュ値まで生成されるかもしれなち
const fn な hasher が仮に存在するならハッシュ値まで生成されるかもしれなち
816デフォルトの名無しさん
2020/07/01(水) 01:50:31.70ID:lPEzgDRr >>815
乱数使ったらハッシュにならんだろ…
乱数使ったらハッシュにならんだろ…
817はちみつ餃子 ◆8X2XSCHEME
2020/07/01(水) 02:44:47.36ID:GH5MkCrA818デフォルトの名無しさん
2020/07/01(水) 09:56:23.65ID:QVn8MqAi 普通に、はなくね?
素数のマジックナンバーと比較してデメリットしかない
汎用性が下がる
コードが煩雑になる
テーブルサイズの整数倍になって効率低下する確率が上がる
素数のマジックナンバーと比較してデメリットしかない
汎用性が下がる
コードが煩雑になる
テーブルサイズの整数倍になって効率低下する確率が上がる
819デフォルトの名無しさん
2020/07/01(水) 10:24:41.03ID:dg6nNgDG >>817
>ハッシュテーブルの寿命の間は一貫した値を使うけど。
キーの値から、ハッシュ値を計算する際、乱数を使っていて、
一貫した値をどうやって取得するの。
// pszKey = キーの0終端文字列
// 戻り値 = キーに対応した Hash値
DWORD CalcHash( const char *pszKey )
{
DWORD hash;
・・・
hash += 乱数; // こんな風にして、どうやって一貫性を確保する??
・・・
return hash;
}
>ハッシュテーブルの寿命の間は一貫した値を使うけど。
キーの値から、ハッシュ値を計算する際、乱数を使っていて、
一貫した値をどうやって取得するの。
// pszKey = キーの0終端文字列
// 戻り値 = キーに対応した Hash値
DWORD CalcHash( const char *pszKey )
{
DWORD hash;
・・・
hash += 乱数; // こんな風にして、どうやって一貫性を確保する??
・・・
return hash;
}
820デフォルトの名無しさん
2020/07/01(水) 10:30:07.77ID:0X9xkDpt hasherの初期化に乱数使う
ハッシュ値の生成のされ方が決定的だと
ユーザーが悪意のある入力列を与えることでハッシュ値の衝突を起こしてシステム負荷を高めるような攻撃ができちゃうのよ
それを避けるために多くの処理系では hasher の初期化に乱数を使ってハッシュ値の生成のされ方を予測しにくいようにしている
ハッシュ値の生成のされ方が決定的だと
ユーザーが悪意のある入力列を与えることでハッシュ値の衝突を起こしてシステム負荷を高めるような攻撃ができちゃうのよ
それを避けるために多くの処理系では hasher の初期化に乱数を使ってハッシュ値の生成のされ方を予測しにくいようにしている
821デフォルトの名無しさん
2020/07/01(水) 10:31:35.11ID:0X9xkDpt 乱数使うのは hasher の初期化だけで、
その後のハッシュ値計算は当然乱数は使わない
その後のハッシュ値計算は当然乱数は使わない
822デフォルトの名無しさん
2020/07/01(水) 10:34:05.17ID:v1S9dNm/ なるほど
823デフォルトの名無しさん
2020/07/01(水) 13:21:11.84ID:gL8G43CT >>820
正直すまんかった
正直すまんかった
824デフォルトの名無しさん
2020/07/01(水) 20:39:53.77ID:LmVeoJWH システム負荷を高めるような攻撃を回避するのって初期化に乱数使うとかじゃなくて、ハッシュテーブルの実装次第じゃね?
システム再起動の時に乱数で変わってたら保存してるハッシュと違くなるって整合性ぐちゃぐちゃすぎる
ちなみにRustは初期化に乱数使ってないけどどの言語がそれに当たるの?
悪いけどホラ吹いてるようにしてみえない
システム再起動の時に乱数で変わってたら保存してるハッシュと違くなるって整合性ぐちゃぐちゃすぎる
ちなみにRustは初期化に乱数使ってないけどどの言語がそれに当たるの?
悪いけどホラ吹いてるようにしてみえない
825デフォルトの名無しさん
2020/07/01(水) 21:21:04.78ID:V2OaFanu ソルト
826デフォルトの名無しさん
2020/07/01(水) 21:27:38.74ID:JqIYLyXt >>824
By default, HashMap uses a hashing algorithm selected to provide resistance against HashDoS attacks. The algorithm is randomly seeded and …
https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html
By default, HashMap uses a hashing algorithm selected to provide resistance against HashDoS attacks. The algorithm is randomly seeded and …
https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html
827デフォルトの名無しさん
2020/07/01(水) 21:35:15.59ID:JRtBzTKp ハッシュの生成はアルゴリズムに対して決定的なんだからハッシャーがどうのなんて馬鹿げてる
828デフォルトの名無しさん
2020/07/02(木) 00:00:35.12ID:53deMRLD Result<T,E> を要素とするイテレータを Result<Vec<T>,E> にしたくて、
よくありそうなパターンだと思うんだけどさらっと上手くやる方法ってないもんかな?
よくありそうなパターンだと思うんだけどさらっと上手くやる方法ってないもんかな?
829デフォルトの名無しさん
2020/07/02(木) 00:03:26.32ID:/WjV7J8q >>828
collectがいい感じにやってくれるよ。
collectがいい感じにやってくれるよ。
830デフォルトの名無しさん
2020/07/02(木) 01:46:12.20ID:T8l/o3UF collect::<Result<Vec<_>, _>>()
831デフォルトの名無しさん
2020/07/02(木) 10:10:47.16ID:O6Sxhm4J 毎回乱数使ってるなら画面更新するたびにハッシュ変わるはずだよね?
https://play.rust-lang.org/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0Ause%20std%3A%3Acollections%3A%3Ahash_map%3A%3ADefaultHasher%3B%0Ause%20std%3A%3Ahash%3A%3AHasher%3B%0A%0Alet%20mut%20hasher%20%3D%20DefaultHasher%3A%3Anew()%3B%0Alet%20data%20%3D%20%5B0x01%2C%200x23%2C%200x45%2C%200x67%2C%200x89%2C%200xab%2C%200xcd%2C%200xef%5D%3B%0A%0Ahasher.write(%26data)%3B%0A%0Aprintln!(%22Hash%20is%20%7B%3Ax%7D!%22%2C%20hasher.finish())%3B%0A%7D&edition=2018
変わらないよ?
https://play.rust-lang.org/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0Ause%20std%3A%3Acollections%3A%3Ahash_map%3A%3ADefaultHasher%3B%0Ause%20std%3A%3Ahash%3A%3AHasher%3B%0A%0Alet%20mut%20hasher%20%3D%20DefaultHasher%3A%3Anew()%3B%0Alet%20data%20%3D%20%5B0x01%2C%200x23%2C%200x45%2C%200x67%2C%200x89%2C%200xab%2C%200xcd%2C%200xef%5D%3B%0A%0Ahasher.write(%26data)%3B%0A%0Aprintln!(%22Hash%20is%20%7B%3Ax%7D!%22%2C%20hasher.finish())%3B%0A%7D&edition=2018
変わらないよ?
832デフォルトの名無しさん
2020/07/02(木) 10:42:54.83ID:NJoiTLER >>831
HashMapと同じことをしたいなら、RandomStateからbuild_hasherでhasherを得ればよい。別に画面更新しなくてもRUN押す度に変わるよ。
HashMapと同じことをしたいなら、RandomStateからbuild_hasherでhasherを得ればよい。別に画面更新しなくてもRUN押す度に変わるよ。
833デフォルトの名無しさん
2020/07/02(木) 10:47:40.50ID:NJoiTLER ちなみにDefaultHasher::newで変わらないのは、単に内部的にSipHasher13::new_with_keys(0,0)を呼んでるから。
RandomStateがその0,0をランダムに変えている。
RandomStateがその0,0をランダムに変えている。
834デフォルトの名無しさん
2020/07/02(木) 12:36:00.56ID:2uT/XA4a Hash値の計算そのものも、本当はかなり速度が求められるものなので、それを
自在に変えるというのはどうやっているのか興味が有る。
Hash値そのものの計算は、遅いわけではないが、それでも膨大なデータを処理する
場合には、その問題になることがある。
自在に変えるというのはどうやっているのか興味が有る。
Hash値そのものの計算は、遅いわけではないが、それでも膨大なデータを処理する
場合には、その問題になることがある。
835デフォルトの名無しさん
2020/07/02(木) 14:34:38.77ID:O6Sxhm4J SipHasher13::new_with_keys(0,0)はソルト?シード?
836デフォルトの名無しさん
2020/07/02(木) 18:18:58.79ID:53deMRLD837デフォルトの名無しさん
2020/07/02(木) 20:30:51.40ID:Smy47/2H collect() があれば何でも出来る
838デフォルトの名無しさん
2020/07/02(木) 21:18:08.94ID:16GApxSC839デフォルトの名無しさん
2020/07/02(木) 22:08:07.26ID:Er9yjZwy collectが中でやってる事って std::convert::from か?
840デフォルトの名無しさん
2020/07/03(金) 01:32:48.51ID:A3vf6ary >>839
FromIterator::from_iter呼んでる
From呼ばれるかどうかはFromIteratorの実相次第だけど
普通はIterator::Itemがそのままコレクションのデータ型になるから呼ばれないと思う
FromIterator::from_iter呼んでる
From呼ばれるかどうかはFromIteratorの実相次第だけど
普通はIterator::Itemがそのままコレクションのデータ型になるから呼ばれないと思う
841デフォルトの名無しさん
2020/07/04(土) 01:28:15.59ID:MbDjr1Zt これがコンパイルエラーになる(sum::<i64>()としないといけない)のってなんでですか?
let s: i64 = (0i64..10).sum() + 10i64;
推論できる材料は十分に見えるんですけども
ちなみにこれなら通ります
let s: i64 = (0..10).sum();
let s: i64 = (0i64..10).sum() + 10i64;
推論できる材料は十分に見えるんですけども
ちなみにこれなら通ります
let s: i64 = (0..10).sum();
842デフォルトの名無しさん
2020/07/04(土) 07:36:29.64ID:mye4TJ7/ rangeはusizeだから
843デフォルトの名無しさん
2020/07/04(土) 15:11:36.89ID:O/jhkl6h >>841
ここに理由書いてるけど、詳しくはわからん
At the moment, we always refuse to guess the "self" type, so we just stop there.
For other type parameters, if Self is known, we will sometimes infer them based on Self
https://github.com/rust-lang/rust/issues/25094#issuecomment-304079316
ここに理由書いてるけど、詳しくはわからん
At the moment, we always refuse to guess the "self" type, so we just stop there.
For other type parameters, if Self is known, we will sometimes infer them based on Self
https://github.com/rust-lang/rust/issues/25094#issuecomment-304079316
844デフォルトの名無しさん
2020/07/04(土) 22:58:43.94ID:6lRd4tzg845デフォルトの名無しさん
2020/07/05(日) 01:30:45.53ID:SD7XkwQZ 今までターボフィッシュで型指定しなくても動いてたものが
新しいimpl追加によって型指定がないと動かなくなるケースがあるというのは理解できる
ただ(0i64..10).sum()のケースはiter::Iterator::sumやiter::Sumの定義から
各要素がi64だと決まってる限り新しいimplが追加されても結果の型もi64にしかならないと思うんだよね
//iter::Iterator::sum
fn sum<S>(self) -> S where Self: Sized, S: Sum<Self::Item>
{
Sum::sum(self)
}
//iter::Sum
pub trait Sum<A = Self>: Sized {
fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}
新しいimpl追加によって型指定がないと動かなくなるケースがあるというのは理解できる
ただ(0i64..10).sum()のケースはiter::Iterator::sumやiter::Sumの定義から
各要素がi64だと決まってる限り新しいimplが追加されても結果の型もi64にしかならないと思うんだよね
//iter::Iterator::sum
fn sum<S>(self) -> S where Self: Sized, S: Sum<Self::Item>
{
Sum::sum(self)
}
//iter::Sum
pub trait Sum<A = Self>: Sized {
fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}
846デフォルトの名無しさん
2020/07/05(日) 23:04:09.03ID:HzchPVMd >>845
まず、
1) inference type(推論された型)と宣言時や実行時の型は別なんで、実行時の型はあくまで推論された型の外延でしかない。
すると、別の型互換のルール(たとえば、部分多相とか)がないと互換の型とみなせない。
2) 公開された部分を推論すると将来の変更で1)から互換性を失う場合がある。
最近型推論導入した言語が公開関数のシグネチャ等を推論しないのはこの問題が理由だと思う。
>ただ(0i64..10).sum()のケースはiter::Iterator::sumやiter::Sumの定義から
>各要素がi64だと決まってる限り新しいimplが追加されても結果の型もi64にしかならないと思うんだよね
これは単にメソッド呼び出しの生成規則: expr0 ". " expr2 [Turbofish] "()" のexpr0から推論しないルールが既にあるからできないだけじゃないの?
これを拡張すると2)から互換性を失う可能性がある。公開された型と関数のシグネチャに依存してるんで。
まず、
1) inference type(推論された型)と宣言時や実行時の型は別なんで、実行時の型はあくまで推論された型の外延でしかない。
すると、別の型互換のルール(たとえば、部分多相とか)がないと互換の型とみなせない。
2) 公開された部分を推論すると将来の変更で1)から互換性を失う場合がある。
最近型推論導入した言語が公開関数のシグネチャ等を推論しないのはこの問題が理由だと思う。
>ただ(0i64..10).sum()のケースはiter::Iterator::sumやiter::Sumの定義から
>各要素がi64だと決まってる限り新しいimplが追加されても結果の型もi64にしかならないと思うんだよね
これは単にメソッド呼び出しの生成規則: expr0 ". " expr2 [Turbofish] "()" のexpr0から推論しないルールが既にあるからできないだけじゃないの?
これを拡張すると2)から互換性を失う可能性がある。公開された型と関数のシグネチャに依存してるんで。
847デフォルトの名無しさん
2020/07/06(月) 00:48:42.43ID:v1x+2Pdq ぶぶんたそー
まれいたそー
まれいたそー
848デフォルトの名無しさん
2020/07/09(木) 06:01:23.92ID:OnQC9Em2 Rustの構文を自分でPython風にしてるんだけど、このwhereのとこの構文がどうも末尾:と相性悪くてどうしたら綺麗になるか教えて欲しい。
問題点
* Self: Sizedの型指定の:と被る(引数の型はかっこに埋まってるからいい)
* 一行目の関数宣言の:があるのに二行目でもwhere使うために:がある(二行続くのは英文法的にもおかしい)
* whereの構文ルールが曖昧(改行入れたりできる) -> だから統一したい
fn sum<S>(self) -> S:
where Self: Sized, S: Sum<Self::Item>:
Sum::sum(self)
問題点
* Self: Sizedの型指定の:と被る(引数の型はかっこに埋まってるからいい)
* 一行目の関数宣言の:があるのに二行目でもwhere使うために:がある(二行続くのは英文法的にもおかしい)
* whereの構文ルールが曖昧(改行入れたりできる) -> だから統一したい
fn sum<S>(self) -> S:
where Self: Sized, S: Sum<Self::Item>:
Sum::sum(self)
849デフォルトの名無しさん
2020/07/09(木) 19:57:31.40ID:/c0BYhMm Rust にトランスパイルされる Python 風構文の言語を作っているということかな?
fn sum<S>(self) -> S
where Self(Sized), S(Sum<Self::Item>):
Sum::sum(self)
こんな感じで class の継承っぽく書くのはいかが
fn sum<S>(self) -> S
where Self(Sized), S(Sum<Self::Item>):
Sum::sum(self)
こんな感じで class の継承っぽく書くのはいかが
850デフォルトの名無しさん
2020/07/09(木) 20:52:03.73ID:OnQC9Em2 そう、そういう言語作ってる最中。
たしかにその構文もいいね!でもstruct S(i32);に見た目上だけど被るのと、トレイトのfn name<T: Num>とかも構文変える必要でてくるなぁ
個人的にはトレイトベースの言語だからT: Numは変えたくないだよね
こういうのもいいかも
fn sum<S>(self) -> S,
(Self: Sized, S: Sum<Self::Item>):
whereと同じような機能でしっくりくる構文持ってる他言語とかないのかなぁ
たしかにその構文もいいね!でもstruct S(i32);に見た目上だけど被るのと、トレイトのfn name<T: Num>とかも構文変える必要でてくるなぁ
個人的にはトレイトベースの言語だからT: Numは変えたくないだよね
こういうのもいいかも
fn sum<S>(self) -> S,
(Self: Sized, S: Sum<Self::Item>):
whereと同じような機能でしっくりくる構文持ってる他言語とかないのかなぁ
851デフォルトの名無しさん
2020/07/11(土) 09:57:59.11ID:4UmqnUG/ Haskell 風にするとかどうよ
852デフォルトの名無しさん
2020/07/11(土) 19:10:01.60ID:F8ozXmMr Winrtよく知らないんだけどWindows環境でGUI簡単にいじれるようになったの?
853デフォルトの名無しさん
2020/07/11(土) 19:28:45.72ID:9BHbJ5O9 どうせマクロ地獄だろ
854デフォルトの名無しさん
2020/07/14(火) 15:40:35.77ID:GDMj7Uve let delta = input[0] - input[1];
println!("{}{}", if delta == 0 { "" } else if delta > 0 { "-" } else { "+" }, delta.abs());
このif delta == 0 { "" } else if delta > 0 { "-" } else { "+" }の綺麗な順番とかの定石の書き方ってある?
println!("{}{}", if delta == 0 { "" } else if delta > 0 { "-" } else { "+" }, delta.abs());
このif delta == 0 { "" } else if delta > 0 { "-" } else { "+" }の綺麗な順番とかの定石の書き方ってある?
855デフォルトの名無しさん
2020/07/14(火) 16:21:46.36ID:0FZUPBc1 match delta.cmp(&0) {
std::cmp::Ordering::Equal => "",
std::cmp::Ordering::Greater => "-",
std::cmp::Ordering::Less => "+",
}
std::cmp::Ordering::Equal => "",
std::cmp::Ordering::Greater => "-",
std::cmp::Ordering::Less => "+",
}
856デフォルトの名無しさん
2020/07/14(火) 18:24:58.52ID:Ott4Q6kl n == 0の時だけ記号なしにしてそれ以外は{:+}でフォーマット
(n > 0の時だけ{:+}にするのでも結果は同じ)
(n > 0の時だけ{:+}にするのでも結果は同じ)
858デフォルトの名無しさん
2020/07/15(水) 17:09:04.17ID:xmMpR3Y8 msvcとgnuってどっちにすべきなん?
859デフォルトの名無しさん
2020/07/15(水) 20:29:35.32ID:hr2ndtrb 両方有るってことはどっちにでも出来るってこった。
どちらかが良いなんてことはない。
どちらかが良いなんてことはない。
860デフォルトの名無しさん
2020/07/15(水) 21:20:40.13ID:a3wypoik rustコンパイルできないけどな
861デフォルトの名無しさん
2020/07/16(木) 01:35:03.21ID:ky3/glay 以下のコードでクロージャclの引数に型推論が効かないのってなんでですか?
fn main() {
let vv = vec![vec![1, 2, 3]; 4];
let cl = |a, b, c, d| vv[a][b] + vv[c][d];
//error[E0282]: type annotations needed
println!("{}", cl(3usize, 1usize, 2usize, 2usize))
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a49b194930fcdfd894c2be4fc078be80
クロージャclの引数のところを |a: usize, b, c: usize, d| とすればコンパイルは通るのですが、aとcだけ型注釈が必要になるのも意味がわからないです
fn main() {
let vv = vec![vec![1, 2, 3]; 4];
let cl = |a, b, c, d| vv[a][b] + vv[c][d];
//error[E0282]: type annotations needed
println!("{}", cl(3usize, 1usize, 2usize, 2usize))
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a49b194930fcdfd894c2be4fc078be80
クロージャclの引数のところを |a: usize, b, c: usize, d| とすればコンパイルは通るのですが、aとcだけ型注釈が必要になるのも意味がわからないです
862デフォルトの名無しさん
2020/07/16(木) 23:09:40.63ID:NQlI+enB jsonをパースして、その中身に対して更に値を追加し
最後にはまたjsonでシリアライズということをやりたいのですが、
serdeだと事前に入力と出力の型を定義していないと難しいですか?
from_stringでValue型に入れて、mapのようにキー名で値を取れることは分かったのですが
そこに新たに値を追加する方法がわからないです
最後にはまたjsonでシリアライズということをやりたいのですが、
serdeだと事前に入力と出力の型を定義していないと難しいですか?
from_stringでValue型に入れて、mapのようにキー名で値を取れることは分かったのですが
そこに新たに値を追加する方法がわからないです
863デフォルトの名無しさん
2020/07/16(木) 23:23:19.49ID:iYXNZZst as_object_mut
あたりかな
あたりかな
864デフォルトの名無しさん
2020/07/17(金) 00:05:43.64ID:wlvhc7i8865デフォルトの名無しさん
2020/07/17(金) 01:59:14.04ID:ppPvs5zR866デフォルトの名無しさん
2020/07/18(土) 18:30:51.49ID:XPr1Z8D3 神がついてるから大丈夫
867デフォルトの名無しさん
2020/07/20(月) 13:18:08.21ID:8IyUCuKf actix-wevからRocketに移行します
868デフォルトの名無しさん
2020/07/21(火) 02:22:25.82ID:119VIs66 >>867
その理由は?
その理由は?
869デフォルトの名無しさん
2020/07/21(火) 18:35:05.91ID:jydcaLWL スライスから差集合を作るの際にスライスをそれぞれhashsetにしてdifference呼ぶ以外で良い書き方ありますか?
870デフォルトの名無しさん
2020/07/22(水) 00:13:53.48ID:g6BKSYlu それぞれsortして先頭から比較していく
871デフォルトの名無しさん
2020/07/22(水) 01:18:16.47ID:EHcGprvb >>869
シンメトリックじゃない単なる差集合なら
片方だけsetにしてもう片方の要素でループしながらチェックするのでもいい気がする
あと状況によってはBroom filterみたいなのを使うと高速化できるかも
シンメトリックじゃない単なる差集合なら
片方だけsetにしてもう片方の要素でループしながらチェックするのでもいい気がする
あと状況によってはBroom filterみたいなのを使うと高速化できるかも
872デフォルトの名無しさん
2020/07/22(水) 13:33:09.23ID:toRz6DNg fn aaa(s: &str) {
if s == "aaa" {
compile_error!(r"If s is "aaa", compile error!");
}
}
fn main() {
// compile error!
aaa("aaa");
// can compile
aaa("aaaaaaaa");
}
こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルになるんだけど回避方法ってないかな
if s == "aaa" {
compile_error!(r"If s is "aaa", compile error!");
}
}
fn main() {
// compile error!
aaa("aaa");
// can compile
aaa("aaaaaaaa");
}
こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルになるんだけど回避方法ってないかな
873デフォルトの名無しさん
2020/07/22(水) 13:33:41.15ID:toRz6DNg こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルになるんだけど回避方法ってないかな
↓
こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルエラーになるんだけど回避方法ってないかな
↓
こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルエラーになるんだけど回避方法ってないかな
874デフォルトの名無しさん
2020/07/22(水) 15:44:52.79ID:vLwW7fFZ875デフォルトの名無しさん
2020/07/22(水) 15:48:48.87ID:uZAjXvzm ダブルクォートがaaaの部分で外れてるのが原因とかじゃなくて?
876デフォルトの名無しさん
2020/07/22(水) 15:58:57.61ID:6Pdi74ki aaa(r#"aaa"iiii"uuuuu"#)
877デフォルトの名無しさん
2020/07/22(水) 16:04:28.78ID:toRz6DNg >>875
ごめん。ここに貼る用のデバッグコメ。
そこ直したら本題の条件分岐のコンパイルエラーにならないのがでてくる
compile_error!(r#"If s is "aaa", compile error!"#);
ごめん。ここに貼る用のデバッグコメ。
そこ直したら本題の条件分岐のコンパイルエラーにならないのがでてくる
compile_error!(r#"If s is "aaa", compile error!"#);
878デフォルトの名無しさん
2020/07/22(水) 18:44:16.24ID:EHcGprvb compile_error!は条件付きコンパイルかマクロでしか使えないんじゃ?
compile_error!と記述してる行がコンパイルするコードに含まれることになったらコンパイルエラー
マクロを展開する段階では変数の値を評価できないから
文字列を受け取る関数に対して特定の文字列を渡すコードがあったらコンパイルエラーってのは無理な気がする
compile_error!と記述してる行がコンパイルするコードに含まれることになったらコンパイルエラー
マクロを展開する段階では変数の値を評価できないから
文字列を受け取る関数に対して特定の文字列を渡すコードがあったらコンパイルエラーってのは無理な気がする
879デフォルトの名無しさん
2020/07/22(水) 22:19:16.93ID:ItqkS36e aaaを手続きマクロにすればできるとは思うけど。
880デフォルトの名無しさん
2020/07/23(木) 01:38:31.65ID:es6swX3J 最近RustのSlackでも出てきた福野泰介ってやつ声でかいよな
こいつどのコミュニティでも何かしら主張して目障りだわ
こいつどのコミュニティでも何かしら主張して目障りだわ
881デフォルトの名無しさん
2020/07/23(木) 01:41:56.15ID:5yzO6ql9 Ubuntu Japanese Team に言いつけて潰してもらおうぜ
882デフォルトの名無しさん
2020/07/23(木) 18:56:28.53ID:Qx3jp5Nz 環境はMacOS Catalina, Rustは1.45.0です
今弄ってる物(https://github.com/Nercury/rust-and-opengl-lessons)で
/lib/gl/src/lib.rs内に
include!(concat!(env!("OUT_DIR"), "/binding.rs"));
というのがあるのですがですがcargo buildすると
this error originates in a macro
error: couldn't read /Users/Path/target/debug/build/gl-71effbf83f5b03a9/out/binding.rs: No such file or directory (os error 2)
と表示されます
https://github.com/rust-analyzer/rust-analyzer/issues/1964
https://github.com/rust-skia/rust-skia/issues/10
などを見たのですが具体的な修正がわかりませんでした。
Rustは最近始めたばかりでincludeマクロやcargoの仕組みなどまだあまり詳しくありません
このinclude!を成功させる方法を教えてください
迷惑をかけてしまうかもしれませんがご教授お願いします
今弄ってる物(https://github.com/Nercury/rust-and-opengl-lessons)で
/lib/gl/src/lib.rs内に
include!(concat!(env!("OUT_DIR"), "/binding.rs"));
というのがあるのですがですがcargo buildすると
this error originates in a macro
error: couldn't read /Users/Path/target/debug/build/gl-71effbf83f5b03a9/out/binding.rs: No such file or directory (os error 2)
と表示されます
https://github.com/rust-analyzer/rust-analyzer/issues/1964
https://github.com/rust-skia/rust-skia/issues/10
などを見たのですが具体的な修正がわかりませんでした。
Rustは最近始めたばかりでincludeマクロやcargoの仕組みなどまだあまり詳しくありません
このinclude!を成功させる方法を教えてください
迷惑をかけてしまうかもしれませんがご教授お願いします
883デフォルトの名無しさん
2020/07/23(木) 19:05:44.31ID:es6swX3J 福野泰介はたしかにどこでも目立つ。
自己顕示欲もあそこまでいったら面白い、反面教師として役立つ
自己顕示欲もあそこまでいったら面白い、反面教師として役立つ
884デフォルトの名無しさん
2020/07/23(木) 21:20:06.43ID:DkkvFejZ >>882
lib/gl/build.rsでOUT_DIRにbinding.rsを作成してる
ビルドスクリプトが意図した通りに動いているのか確認するために
build.rsを変更してbinding.rsのフルパスをprintlnでもするようにして
cargo build -vvしてみるといいと思う
ビルドスクリプトについて詳細知りたければこの辺読んで
https://doc.rust-lang.org/cargo/reference/build-script-examples.html
lib/gl/build.rsでOUT_DIRにbinding.rsを作成してる
ビルドスクリプトが意図した通りに動いているのか確認するために
build.rsを変更してbinding.rsのフルパスをprintlnでもするようにして
cargo build -vvしてみるといいと思う
ビルドスクリプトについて詳細知りたければこの辺読んで
https://doc.rust-lang.org/cargo/reference/build-script-examples.html
885デフォルトの名無しさん
2020/07/24(金) 00:48:59.83ID:j+hLU6yH886デフォルトの名無しさん
2020/07/24(金) 10:22:52.41ID:c87Ipt6p 同じサーバー内でポート別にクライアント用サーバー(Nuxt)とAPI用サーバー(Rust)立ち上げるのってどう思う?
クライアント用サーバーは初回しか性能響かないからあれだけど、Rustの方が断然速いし、SPAだからルートの設定も全然しなくていいし、Rustの方でフロントページも返した方がいいんじゃないかと思ってるんだけども
要はRustを実行すればポート別に2つサーバーが立ち上がるようにするってこと
クライアント用サーバーは初回しか性能響かないからあれだけど、Rustの方が断然速いし、SPAだからルートの設定も全然しなくていいし、Rustの方でフロントページも返した方がいいんじゃないかと思ってるんだけども
要はRustを実行すればポート別に2つサーバーが立ち上がるようにするってこと
887デフォルトの名無しさん
2020/07/25(土) 18:01:19.70ID:n+xx7yT/ RocketってRust公式サイトにも使われてるのか
迷ったらRocketで良さそうだな
迷ったらRocketで良さそうだな
888デフォルトの名無しさん
2020/07/26(日) 03:19:09.22ID:XCGG5OQ8 diesel使いづらくない?
889デフォルトの名無しさん
2020/07/26(日) 18:57:03.68ID:uWZribv0 rustcの-C llvm-args=が取り得るオプションの説明ってどこかに書いてある?
clangのttps://clang.llvm.org/docs/ClangCommandLineReference.html#x86
あたりがそれっぽいけど説明が全くないのでデフォルト値も効果もよく判らない
clangのttps://clang.llvm.org/docs/ClangCommandLineReference.html#x86
あたりがそれっぽいけど説明が全くないのでデフォルト値も効果もよく判らない
890デフォルトの名無しさん
2020/07/26(日) 22:31:29.89ID:T2XYMYOv >>889
ここに書いてあるけど'--help'を渡せば一覧表示されるみたいよ
https://doc.rust-lang.org/rustc/codegen-options/index.html#llvm-args
$ rustc -C llvm-args='--help'
ここに書いてあるけど'--help'を渡せば一覧表示されるみたいよ
https://doc.rust-lang.org/rustc/codegen-options/index.html#llvm-args
$ rustc -C llvm-args='--help'
891デフォルトの名無しさん
2020/07/26(日) 23:02:23.88ID:XCGG5OQ8 あるモジュールクラスを別のモジュールで使いたい場合ってどう宣言するのが正しいの?
正直ドキュメント読んでも分からん
正直ドキュメント読んでも分からん
892デフォルトの名無しさん
2020/07/26(日) 23:58:47.45ID:uWZribv0 >>890
サンキュ。そう使うのかよw うちの環境では
>rustc -C llvm-args=--help ←'を付けると怒られる
でそれっぽいのが得られました。amd64で使用命令を選択するようなオプションは無いのか・・・
サンキュ。そう使うのかよw うちの環境では
>rustc -C llvm-args=--help ←'を付けると怒られる
でそれっぽいのが得られました。amd64で使用命令を選択するようなオプションは無いのか・・・
893デフォルトの名無しさん
2020/07/27(月) 00:46:16.95ID:TQCIWmFu --helpの最後に出てたけど
利用可能なオプションを全部表示するには
llvm-args=--help-hiddenってするみたい
利用可能なオプションを全部表示するには
llvm-args=--help-hiddenってするみたい
894デフォルトの名無しさん
2020/07/27(月) 09:47:21.61ID:s6eJseAH chronoのnext_monthないのってどう実現すればできる?
895デフォルトの名無しさん
2020/07/27(月) 10:10:01.73ID:0SvTsOI7 >>894
そもそもnext_monthに何を期待するかによると思うが。30日後?31日後?翌月の同じ日?それが存在しない場合は?とか。その辺がはっきりすれば、その通りに実装すればいい。
そもそもnext_monthに何を期待するかによると思うが。30日後?31日後?翌月の同じ日?それが存在しない場合は?とか。その辺がはっきりすれば、その通りに実装すればいい。
896デフォルトの名無しさん
2020/07/27(月) 10:18:30.24ID:0SvTsOI7897デフォルトの名無しさん
2020/07/27(月) 16:16:44.20ID:s6eJseAH >>896
ありがとう、結局next_month自分で実装したけど、かなり頻繁に使われる類のメソッドだから正直きついな
with_monthもoptionで返すから31 -> 30の次月遷移したとしても安全だから実装しない理由が分かんないな
chronoは変なとこには手回ってるしよくわからん
ありがとう、結局next_month自分で実装したけど、かなり頻繁に使われる類のメソッドだから正直きついな
with_monthもoptionで返すから31 -> 30の次月遷移したとしても安全だから実装しない理由が分かんないな
chronoは変なとこには手回ってるしよくわからん
898デフォルトの名無しさん
2020/07/27(月) 18:03:20.70ID:SSpP96W4 >>897
issueはあるけど別に誰かが反対しているわけでもなく、
単に誰も実装してないだけじゃない?
PR出してみればいいと思うけど。
https://github.com/chronotope/chrono/issues/290
issueはあるけど別に誰かが反対しているわけでもなく、
単に誰も実装してないだけじゃない?
PR出してみればいいと思うけど。
https://github.com/chronotope/chrono/issues/290
899デフォルトの名無しさん
2020/07/28(火) 16:26:39.82ID:0KPYC4VC900デフォルトの名無しさん
2020/07/29(水) 11:56:30.09ID:blHj/j43 ed25519の公開鍵のssh-ed25519 ******の部分が欲しくて、ed25519_dalekっていうクレートで鍵作ってるんだけどPublicKey構造体のas_bytesでとってくるバイト列をstr::from_utf8でしてもエラーが出て秘密鍵の***部分にならないんだけど、どうすればいいか分かる?
https://docs.rs/ed25519-dalek/1.0.0-pre.4/ed25519_dalek/struct.PublicKey.html
https://docs.rs/ed25519-dalek/1.0.0-pre.4/ed25519_dalek/struct.PublicKey.html
901デフォルトの名無しさん
2020/07/29(水) 20:03:32.01ID:B1rudV7D 1byteずつ print!("{:02x}", b) するとかではなく?
902デフォルトの名無しさん
2020/07/29(水) 21:31:44.28ID:4K5iZ0U7 >>900
str::from_utf8でエラーになるのは
0~127までのUTF-8互換のASCII以外の文字が含まれてるからでは?
pemで見れる公開鍵のssh-ed25519 ******の部分は
keyの種別とDERエンコードしたkeyの値をBase64にしたものらしい
str::from_utf8でエラーになるのは
0~127までのUTF-8互換のASCII以外の文字が含まれてるからでは?
pemで見れる公開鍵のssh-ed25519 ******の部分は
keyの種別とDERエンコードしたkeyの値をBase64にしたものらしい
903デフォルトの名無しさん
2020/07/30(木) 13:54:57.65ID:AECjseqQ904デフォルトの名無しさん
2020/07/31(金) 22:54:06.06ID:Emo7hM/W bindgenにwindowsはllvmのプリビルドバイナリをインストールしなさいと書いてあるけど、
LIBCLANG_PATH設定し忘れるとwinのプリビルドバイナリには含まれてないllvm-configを使って<LLVM_ROOT>/binまでのパスを探すんで
llvm-configがないって怒られる罠がある。
LIBCLANG_PATHタイポして時間潰してしまった。
LIBCLANG_PATH設定し忘れるとwinのプリビルドバイナリには含まれてないllvm-configを使って<LLVM_ROOT>/binまでのパスを探すんで
llvm-configがないって怒られる罠がある。
LIBCLANG_PATHタイポして時間潰してしまった。
905デフォルトの名無しさん
2020/08/01(土) 14:02:57.08ID:cK8sGWsa やっぱactixよりrocketだな
906デフォルトの名無しさん
2020/08/01(土) 14:09:11.29ID:sGuB7emE >>905
その理由は?
その理由は?
907デフォルトの名無しさん
2020/08/01(土) 15:02:20.03ID:Sq3FCv8n なんか速そうじゃん
908デフォルトの名無しさん
2020/08/01(土) 15:19:22.53ID:cK8sGWsa >>906
ドキュメントがしっかりしてそう
ドキュメントがしっかりしてそう
909デフォルトの名無しさん
2020/08/01(土) 16:43:51.04ID:Gnfef8LF unsafeの個数が少ない方が勝ちって事でいいんじゃない?
910デフォルトの名無しさん
2020/08/01(土) 22:13:51.53ID:cK8sGWsa rocketってmultipartサポートしてないのか
911小石茶輝
2020/08/01(土) 23:31:58.80ID:hdo7vbOv unsafe という機能があるのは unsafe が必要だからです。
設計方針に対して必要以上に unsafe があるのはダメですが、
少なければ少ないほど良いというわけでもありません。
たとえば C++ を使っているときだって、
グラフィックドライバを書くときとかは
どうしたって (C++ 的には) 行儀の悪い書き方になってしまうでしょう。
行儀の悪い部分はなるべく低レイヤに押し込めて、
ロジック層が綺麗になるようにするのが望ましいなどといった習慣はありますが、
どの程度にするかの程度問題は設計方針によります。
actix は rocket よりも unsafe を多用してはいますが、
意図のはっきりした unsafe です。
あまりにも unsafe が多すぎるならもう Rust 使うのやめろよと思うかもしれませんが、
行儀の悪い書き方 (unsafe) がより明示的であるというだけでも
C++ よりは少しマシでしょう。
設計方針に対して必要以上に unsafe があるのはダメですが、
少なければ少ないほど良いというわけでもありません。
たとえば C++ を使っているときだって、
グラフィックドライバを書くときとかは
どうしたって (C++ 的には) 行儀の悪い書き方になってしまうでしょう。
行儀の悪い部分はなるべく低レイヤに押し込めて、
ロジック層が綺麗になるようにするのが望ましいなどといった習慣はありますが、
どの程度にするかの程度問題は設計方針によります。
actix は rocket よりも unsafe を多用してはいますが、
意図のはっきりした unsafe です。
あまりにも unsafe が多すぎるならもう Rust 使うのやめろよと思うかもしれませんが、
行儀の悪い書き方 (unsafe) がより明示的であるというだけでも
C++ よりは少しマシでしょう。
912デフォルトの名無しさん
2020/08/06(木) 21:31:08.70ID:3hCyvjau rust案件が出てこないのは何で?
913小石茶輝
2020/08/06(木) 23:35:19.16ID:m6Z7F3X/ 出てますよ。
あなたがそれをキャッチする立場にないだけです。
あなたがそれをキャッチする立場にないだけです。
914デフォルトの名無しさん
2020/08/08(土) 01:19:04.76ID:4kKr75Ow stdの中でこれは外部ライブラリにした方がいいんじゃないかなって思うやつある?
逆に外部ライブラリからstdにした方がいいんじゃないかってやつとかもある?
逆に外部ライブラリからstdにした方がいいんじゃないかってやつとかもある?
915デフォルトの名無しさん
2020/08/08(土) 06:00:59.71ID:6YjyRljP >>914
乱数ライブラリが標準ライブラリに入ってない言語とか他にあんの?
乱数ライブラリが標準ライブラリに入ってない言語とか他にあんの?
916デフォルトの名無しさん
2020/08/09(日) 00:20:40.65ID:ayHdPpdd 乱数は用途によって必要な性質が色々だからなぁ。
どの分野を優遇すべきかってのは自明ではないでしょ。
全部盛りにするのも Rust 的ではないし。
でも、どの乱数ライブラリを使うにしても同じようなインターフェイスだとありがたいので、
乱数ライブラリが満たすべき標準的なトレイトが提供されて欲しいし、
そのサンプル的な位置づけでひとつくらいは乱数ライブラリが入っていてもいいかなとは思う。
どの分野を優遇すべきかってのは自明ではないでしょ。
全部盛りにするのも Rust 的ではないし。
でも、どの乱数ライブラリを使うにしても同じようなインターフェイスだとありがたいので、
乱数ライブラリが満たすべき標準的なトレイトが提供されて欲しいし、
そのサンプル的な位置づけでひとつくらいは乱数ライブラリが入っていてもいいかなとは思う。
>>916
MT だけでいいと思うのですが
MT だけでいいと思うのですが
918はちみつ餃子 ◆8X2XSCHEME
2020/08/09(日) 00:43:58.48ID:ayHdPpdd >>918
確かに暗号にMTを使うのはダメですね、暗号用には crypt-MT がありますね
確かに暗号にMTを使うのはダメですね、暗号用には crypt-MT がありますね
920デフォルトの名無しさん
2020/08/09(日) 20:40:18.77ID:mU0jSAp3 今はもうMTもそこまで・・・って話じゃないっけ
randクレート見るとそんなこと書いてあったような
randクレート見るとそんなこと書いてあったような
921デフォルトの名無しさん
2020/08/09(日) 20:55:04.69ID:wx6Xp3NP 他の言語だって完璧な乱数だと思ってなくても
利用者の利便性を考えて標準ライブラリに含めてるんだろ
それが無いRustは変
利用者の利便性を考えて標準ライブラリに含めてるんだろ
それが無いRustは変
922デフォルトの名無しさん
2020/08/10(月) 00:22:38.94ID://dLtD59 今どきMT法なんか使わん。
>乱数ライブラリが満たすべき標準的なトレイトが提供されて欲しいし、
rand_coreがそれに当たるけどcoreだけだとバイト配列しか取得できんので分布器に生成器渡せん。
未知の生成器の実装すべて含めるのは無理、既知のものに絞っても要求する特性が人によって違うから標準にするのは無理。
結局はこうなるが、俺も標準ライブラリに乱数ほしい。
>乱数ライブラリが満たすべき標準的なトレイトが提供されて欲しいし、
rand_coreがそれに当たるけどcoreだけだとバイト配列しか取得できんので分布器に生成器渡せん。
未知の生成器の実装すべて含めるのは無理、既知のものに絞っても要求する特性が人によって違うから標準にするのは無理。
結局はこうなるが、俺も標準ライブラリに乱数ほしい。
923デフォルトの名無しさん
2020/08/10(月) 01:32:59.38ID:5CSXOdci cargo使ってるから別ライブラリでもあまり困らない
こと乱数に関してはデファクトスタンダードのcraete決まってるし迷うことないしね
標準ライブラリに入ってて欲しいのは初学者がcrate知らないとか探すのが手間だとか、コンパイルタイムが延びるのが嫌だとか、そういう理由?
こと乱数に関してはデファクトスタンダードのcraete決まってるし迷うことないしね
標準ライブラリに入ってて欲しいのは初学者がcrate知らないとか探すのが手間だとか、コンパイルタイムが延びるのが嫌だとか、そういう理由?
924デフォルトの名無しさん
2020/08/10(月) 02:16:28.69ID:PbB9rIkO stdに入れて欲しいのはrandよりregexだな
標準ライブラリとして責任もってメンテされていくものなのかどうかが重要
標準ライブラリとして責任もってメンテされていくものなのかどうかが重要
925デフォルトの名無しさん
2020/08/10(月) 03:21:04.11ID:5WLgK92c926デフォルトの名無しさん
2020/08/10(月) 04:22:44.62ID:qbs6FNC5 Authors のところが The Rust Project Developers ってなってるやつは
事実上の標準みたいなもんと思ってええんけ?
将来の互換性が保証されるかどうかはともかくとして Rust と足並みがそろっているとは
思っていいよね?
事実上の標準みたいなもんと思ってええんけ?
将来の互換性が保証されるかどうかはともかくとして Rust と足並みがそろっているとは
思っていいよね?
927デフォルトの名無しさん
2020/08/10(月) 05:17:58.40ID:ELRN+pEU jsonrpc使ってみた。不可解な実装でワロタ
928デフォルトの名無しさん
2020/08/10(月) 23:12:44.03ID:xrY++dmg 外に出されたunicode系ライブラリが更新止まってていつかstdがサポートするunicodeのバージョンと互換性失うんじゃないかと思う。
>>926
事実上の標準っていうかc++のboostみたいなもんだけど足並み揃ってるかは別。
>>926
事実上の標準っていうかc++のboostみたいなもんだけど足並み揃ってるかは別。
929デフォルトの名無しさん
2020/08/11(火) 13:18:54.05ID:vv5Ejmf9 use std::ops::{Rem, AddAssign};
pub fn get_days_of_month<T: Rem>(year: T, month: u32) -> u32 {
match month {
2 => if is_leap_year(year) { 29 } else { 28 },
4 | 6 | 9 | 11 => 30,
_ => 31,
}
}
pub fn is_leap_year<T: Rem>(year: T) -> bool {
match ((year % 100 as T) as i32, (year % 400 as T) as i32) {
(_, 0) => true,
(0, _) => false,
_ => year % 4 == 0,
}
}
pub fn next_day<N, T: AddAssign + Rem>(mut year: T, mut month: u32, mut day: u32) -> (T, u32, u32) {
let days_of_month = get_days_of_month(year, month);
day += 1;
if day > days_of_month {
month += 1;
day = 1;
}
if month > 12 {
year += 1;
month = 1;
}
(year, month, day)
}
non-primitive castエラーが出るんだけどどうすれば解決できる?
1 as Tでもできないし、1.parse()はstrじゃないから出来ない
pub fn get_days_of_month<T: Rem>(year: T, month: u32) -> u32 {
match month {
2 => if is_leap_year(year) { 29 } else { 28 },
4 | 6 | 9 | 11 => 30,
_ => 31,
}
}
pub fn is_leap_year<T: Rem>(year: T) -> bool {
match ((year % 100 as T) as i32, (year % 400 as T) as i32) {
(_, 0) => true,
(0, _) => false,
_ => year % 4 == 0,
}
}
pub fn next_day<N, T: AddAssign + Rem>(mut year: T, mut month: u32, mut day: u32) -> (T, u32, u32) {
let days_of_month = get_days_of_month(year, month);
day += 1;
if day > days_of_month {
month += 1;
day = 1;
}
if month > 12 {
year += 1;
month = 1;
}
(year, month, day)
}
non-primitive castエラーが出るんだけどどうすれば解決できる?
1 as Tでもできないし、1.parse()はstrじゃないから出来ない
930デフォルトの名無しさん
2020/08/11(火) 13:40:48.45ID:+G0SPKi4 >>929
num-traitsのOneで制約すればT::one()でT型の1が得られる。
num-traitsのOneで制約すればT::one()でT型の1が得られる。
931デフォルトの名無しさん
2020/08/11(火) 17:18:59.34ID:vv5Ejmf9932デフォルトの名無しさん
2020/08/11(火) 18:03:39.15ID:9N1UW9Um933デフォルトの名無しさん
2020/08/13(木) 18:54:36.47ID:ilszh1HB ゲーム開発言語はrustに移行されるかな?
934デフォルトの名無しさん
2020/08/13(木) 23:00:02.19ID:XvzayrDj プログラミング言語「Rust」、Linuxカーネルでの採用の道を模索
https://japan.zdnet.com/article/35157012/
https://japan.zdnet.com/article/35157012/
935デフォルトの名無しさん
2020/08/14(金) 22:24:07.75ID:O4QC6Gpt936デフォルトの名無しさん
2020/08/15(土) 03:05:14.85ID:py5/TuN/ ラズパイとかでコンパイルすると糞遅いのなんとかならんかな
937デフォルトの名無しさん
2020/08/15(土) 06:26:45.05ID:KV0ftL1X 禁断のCPU換装とかないの?
DOS/Vパワーリポートとか買ってみたら。
DOS/Vパワーリポートとか買ってみたら。
938デフォルトの名無しさん
2020/08/15(土) 06:47:50.15ID:c5MlwM8B >>936
クロスコンパイルすれば?
クロスコンパイルすれば?
939デフォルトの名無しさん
2020/08/15(土) 21:53:54.93ID:aUDFhJGy というよりなんでセルフコンパイルするんや?
940デフォルトの名無しさん
2020/08/15(土) 23:19:51.01ID:aMnBEbVz rustじゃないけど適当な設定で大きいライブラリビルドしたら過熱でラズパイ落ちた事あるわ
941デフォルトの名無しさん
2020/08/17(月) 18:33:01.49ID:L4/FmhKh Rより低いRust...
https://japan.zdnet.com/article/35158190/
https://japan.zdnet.com/article/35158190/
942デフォルトの名無しさん
2020/08/18(火) 04:18:41.28ID:Hi0tASG0 rustって日本で人気という勝手なイメージがあるけど世界的にはどうなんだろ
943デフォルトの名無しさん
2020/08/18(火) 04:32:12.17ID:G86KA+uV ルスト?なにそれ?てかそんなの聞いた事ないんだけど
944デフォルトの名無しさん
2020/08/18(火) 15:54:29.74ID:GTs4Jp23 >>941
Goの方がマスコットがかわいいからしゃーない。
Goの方がマスコットがかわいいからしゃーない。
945デフォルトの名無しさん
2020/08/18(火) 16:39:58.87ID:A66tt0Hu マスコットが気持ち悪い言語と言えばLISP
946デフォルトの名無しさん
2020/08/18(火) 18:04:09.30ID:FC5XBFLB947デフォルトの名無しさん
2020/08/18(火) 18:17:07.57ID:xqTakpBf >>941
調査によって、まちまちだな。
StackOverflowでは、Rustは好きな言語ランキングでは、五年連続Topらしいが、
「人気」は低い。
今のところ「好き」だが「人気」は無いのがRust。
恐らくこの場合、「人気」= 「Popular」のことで、英語の Poluarは、
「人気」と言う意味のほかに、「普及している」とか「一般的」、というような
意味もあるのでややこしい:
https://news.mynavi.jp/article/20190412-807191/
調査によって、まちまちだな。
StackOverflowでは、Rustは好きな言語ランキングでは、五年連続Topらしいが、
「人気」は低い。
今のところ「好き」だが「人気」は無いのがRust。
恐らくこの場合、「人気」= 「Popular」のことで、英語の Poluarは、
「人気」と言う意味のほかに、「普及している」とか「一般的」、というような
意味もあるのでややこしい:
https://news.mynavi.jp/article/20190412-807191/
948デフォルトの名無しさん
2020/08/18(火) 18:30:54.90ID:xqTakpBf 「好き」ならば「学びたい」のだろう、と思いきや、そうでもないということか。
「最も好きな言語は何ですか?」
という問に対して、相手に馬鹿にされないためには、Rustが丁度よい言語
である気はする。
でも、結構、実際に使用したいと思っているどうかは別。
俺もそんな質問されたら、答えに窮して Rust と答えてしまうかも知れんが、
使う気はほぼ無い。
「最も好きな言語は何ですか?」
という問に対して、相手に馬鹿にされないためには、Rustが丁度よい言語
である気はする。
でも、結構、実際に使用したいと思っているどうかは別。
俺もそんな質問されたら、答えに窮して Rust と答えてしまうかも知れんが、
使う気はほぼ無い。
949デフォルトの名無しさん
2020/08/18(火) 21:58:33.67ID:eVuhfWpC Rustはターゲットになる開発領域が狭くてどう足掻いても大人気誰も彼もRust!なんてことにはならないよ
C++が広範な領域で使われてたのは選択肢のなさとWinのAPI基準の1つなのとCとの運用のしやすさ
選択肢が増えてWinもよっぽどなことしなけりゃC#があるしCをコールする分にはどの言語も十分改善されてきた
0から作るある程度のパフォーマンスを求めるプロダクトならGoがあって、アセンブリと連携するけどcgoのオーバーヘッドやGCのオーバーヘッドが気になるみたいな際際じゃなけりゃRustにならない
計算高速化のcalleeとしては安全性があまり旨味のない要素だからC++の選択がまだ強い
以上に加えてエラー周りとかアセンブリ連携もnightlyがあってまだ熟してない部分があり厳しい立ち位置にいるという認識だ
C++が広範な領域で使われてたのは選択肢のなさとWinのAPI基準の1つなのとCとの運用のしやすさ
選択肢が増えてWinもよっぽどなことしなけりゃC#があるしCをコールする分にはどの言語も十分改善されてきた
0から作るある程度のパフォーマンスを求めるプロダクトならGoがあって、アセンブリと連携するけどcgoのオーバーヘッドやGCのオーバーヘッドが気になるみたいな際際じゃなけりゃRustにならない
計算高速化のcalleeとしては安全性があまり旨味のない要素だからC++の選択がまだ強い
以上に加えてエラー周りとかアセンブリ連携もnightlyがあってまだ熟してない部分があり厳しい立ち位置にいるという認識だ
951デフォルトの名無しさん
2020/08/18(火) 22:21:20.07ID:y+NJXGZa >>949
その中だとパフォーマンス的にはGoでいいけど言語仕様が簡素すぎて辛い、みたいな層の受け皿としてRustが使われてるケースはありそうかな。
ScalaがいいけどJVMは厳しい、みたいなのとかも。
まぁニッチなのは間違いない。
その中だとパフォーマンス的にはGoでいいけど言語仕様が簡素すぎて辛い、みたいな層の受け皿としてRustが使われてるケースはありそうかな。
ScalaがいいけどJVMは厳しい、みたいなのとかも。
まぁニッチなのは間違いない。
952デフォルトの名無しさん
2020/08/18(火) 22:56:18.34ID:tqFHaZPp Microsoftが興味持ってるからC# + Rustが未来の姿だ
UIはC#
UIはC#
953デフォルトの名無しさん
2020/08/18(火) 23:14:15.49ID:eVuhfWpC >>950
TensorflowとかPytorchのバックはC++だよね
これらは当然CUDAとの兼ね合いであるのは間違いないけど、CUDA側がRustではなくC++を選択してる意図として安全性の旨味のなさは間違ってないと思う
C++の仕様が先立つ言語であることや人口の多さ、既存資産との兼ね合いの比重のが大きいだろうけどね
TensorflowとかPytorchのバックはC++だよね
これらは当然CUDAとの兼ね合いであるのは間違いないけど、CUDA側がRustではなくC++を選択してる意図として安全性の旨味のなさは間違ってないと思う
C++の仕様が先立つ言語であることや人口の多さ、既存資産との兼ね合いの比重のが大きいだろうけどね
954デフォルトの名無しさん
2020/08/18(火) 23:33:09.98ID:bX3QY+Cn >>953
そりゃCUDA1.0の頃(もう10年以上前だぞ)にRustなんて影も形もなかったんだから選択されないのは当然だろう。
その視点で見るならここ1-2年で開発開始されるプロジェクトでどの程度採用されるか、では?
今だとブロックチェーン界隈とかかね。
そりゃCUDA1.0の頃(もう10年以上前だぞ)にRustなんて影も形もなかったんだから選択されないのは当然だろう。
その視点で見るならここ1-2年で開発開始されるプロジェクトでどの程度採用されるか、では?
今だとブロックチェーン界隈とかかね。
955デフォルトの名無しさん
2020/08/19(水) 01:11:27.31ID:I1IAXvPk >>949
rustは元からサーバーは視野に入れてないだろ
rustは元からサーバーは視野に入れてないだろ
956デフォルトの名無しさん
2020/08/19(水) 03:59:31.08ID:HXpA5baw "abc".split("").collect::<Vec<_>>()は["", "a", "b", "c", ""]になるんだけど、うまく空白なしでスプリットでできない?
957デフォルトの名無しさん
2020/08/19(水) 04:27:22.19ID:0Kuyi32B .charsじゃなくてどうしても.split使ってvecにしたいってことなのか?
958デフォルトの名無しさん
2020/08/19(水) 04:32:39.30ID:0Kuyi32B "abc".split_terminator("").skip(1).collect::<Vec<_>>();でできるけど
普通はchars使うやろ
普通はchars使うやろ
959デフォルトの名無しさん
2020/08/19(水) 10:35:25.48ID:HXpA5baw960デフォルトの名無しさん
2020/08/19(水) 10:42:04.16ID:3t1Yn2l3 charと&strって&strのがでかくね????
961デフォルトの名無しさん
2020/08/19(水) 10:54:53.71ID:HXpA5baw962デフォルトの名無しさん
2020/08/19(水) 11:03:27.99ID:6EiBw6oz >>961
でも最後にVecに格納するポインタは一文字ごとに8バイト取られるんだから、charの方が小さくない?
でも最後にVecに格納するポインタは一文字ごとに8バイト取られるんだから、charの方が小さくない?
963デフォルトの名無しさん
2020/08/19(水) 12:52:58.21ID:ysyRx3At &strはfat pointerだから16byte じゃね
964デフォルトの名無しさん
2020/08/19(水) 13:05:48.82ID:P3FDipJp 確かに16バイトだね。parseにしてもto_digitでいいし、Vec<&str>のメリットはなさそう。
965デフォルトの名無しさん
2020/08/19(水) 14:18:38.67ID:Rgg+SJNu Rustのコア開発者達がMozillaのリストラで大量解雇されたようだが大丈夫なのか?
966デフォルトの名無しさん
2020/08/19(水) 14:44:59.88ID:WLoKFS1m MozillaとRust Core Team、Rustの非営利団体を立ち上げへ
https://mag.osdn.jp/20/08/20/104100
Mozillaのプログラミング言語「Rust」を開発するRust Core TeamとMozillaは8月18日、独自の非営利団体を立ち上げることを発表した。Mozillaの大規模なリストラ計画を受け、Rustプロジェクトの安定を図る。
Mozillaは約250人規模の人員解雇計画を明らかにしているが、この中にはRustプロジェクトやコミュニティにアクティブに参加しているメンバーも含まれるという。
この再編計画がプロジェクトとしてのRustに対する不確実性を生んでいることから、非営利団体立ち上げを急ピッチで進めることにしたようだ。
なおRustにはMozilla外部からの貢献も多く、Mozilla内部の開発者の多くも余暇を使って参加しているため、Mozillaの再編計画によりプロジェクトが大きな影響を受けることはないとしている。
https://mag.osdn.jp/20/08/20/104100
Mozillaのプログラミング言語「Rust」を開発するRust Core TeamとMozillaは8月18日、独自の非営利団体を立ち上げることを発表した。Mozillaの大規模なリストラ計画を受け、Rustプロジェクトの安定を図る。
Mozillaは約250人規模の人員解雇計画を明らかにしているが、この中にはRustプロジェクトやコミュニティにアクティブに参加しているメンバーも含まれるという。
この再編計画がプロジェクトとしてのRustに対する不確実性を生んでいることから、非営利団体立ち上げを急ピッチで進めることにしたようだ。
なおRustにはMozilla外部からの貢献も多く、Mozilla内部の開発者の多くも余暇を使って参加しているため、Mozillaの再編計画によりプロジェクトが大きな影響を受けることはないとしている。
967デフォルトの名無しさん
2020/08/19(水) 15:18:50.67ID:tsnEmyts 解雇された人のtwitterとか見てると
「弊社でRust書きませんか?」なオファーが殺到って感じだし
個人の生活としてはそんなに問題ないんじゃないかな。
Rustの開発に割ける時間が増えるのか減るのかは知らんが。
「弊社でRust書きませんか?」なオファーが殺到って感じだし
個人の生活としてはそんなに問題ないんじゃないかな。
Rustの開発に割ける時間が増えるのか減るのかは知らんが。
968デフォルトの名無しさん
2020/08/19(水) 17:11:33.75ID:Zv91SX/x Rust財団作って開発と管理を移管するのかね
その後プラチナスポンサーにMicrosoftがいても驚きはないな
その後プラチナスポンサーにMicrosoftがいても驚きはないな
969デフォルトの名無しさん
2020/08/19(水) 18:13:15.60ID:J1Jz5rCd 非営利団体を立ち上げるらしいですね、安心安心
970デフォルトの名無しさん
2020/08/19(水) 21:07:57.58ID:g0VuJGRT >>966の記事でも触れてるけどrustはコントリビュータが多いからmozillaの再編は影響すくない。
mozillaの中のままでmozillaの計画の影響受けたら面倒くさいからこの際独立しようって考えだろうね。
といかMozillaのはアフターコロナを見据えた再計画なんでアメリカにしてはコロナに関してはまともな部類なんだけど国内でどう見られるかだね。
mozillaの中のままでmozillaの計画の影響受けたら面倒くさいからこの際独立しようって考えだろうね。
といかMozillaのはアフターコロナを見据えた再計画なんでアメリカにしてはコロナに関してはまともな部類なんだけど国内でどう見られるかだね。
971デフォルトの名無しさん
2020/08/19(水) 22:22:34.63ID:2mI2lZ4E Servo開発者が解雇されるみたいだね
972デフォルトの名無しさん
2020/08/20(木) 01:56:33.75ID:U3jykTiC 僕も解雇されてニートになったんで暇つぶしにRust始めようかと思うんですがRustって個人の趣味として使うならナンセンスなんですか?
WinのGUI開発しようと思ってるんですがあんまり情報ないですよね
WinのGUI開発しようと思ってるんですがあんまり情報ないですよね
973デフォルトの名無しさん
2020/08/20(木) 07:40:13.19ID:VY9dfKBD その用途なら素直にC#使えば?
974デフォルトの名無しさん
2020/08/20(木) 11:28:50.60ID:RX/3qqm6 Xamarinより糞なものが完成するだろう
975デフォルトの名無しさん
2020/08/20(木) 13:10:46.32ID:bydbmtvj 趣味なら好きなもの興味のあるものつかえばええ
976デフォルトの名無しさん
2020/08/20(木) 14:37:00.37ID:uihwOB88 PythonとJSをちょっと書けるくらいなんですが
Rustを勉強する前にCをやったほうがいいですか?
Rustを勉強する前にCをやったほうがいいですか?
977デフォルトの名無しさん
2020/08/20(木) 16:14:06.53ID:TxgxGTNZ 時間の無駄だからやらないでいいよ
978デフォルトの名無しさん
2020/08/20(木) 16:38:36.44ID:Z64Rk/C4 人生なんて生きてる間の暇潰しだろ
979デフォルトの名無しさん
2020/08/20(木) 17:19:36.86ID:RX/3qqm6 川上さんが同じこと言ってた
980デフォルトの名無しさん
2020/08/20(木) 18:34:28.31ID:0udGtUoq >>976
一度Cを書かないとRustのありがたみの半分が理解できないよ
一度Cを書かないとRustのありがたみの半分が理解できないよ
981デフォルトの名無しさん
2020/08/20(木) 21:01:28.94ID:TxgxGTNZ そんなことはない
やらなくていい
やらなくていい
982デフォルトの名無しさん
2020/08/20(木) 22:00:49.47ID:Ga5wwJ4q 世の中にはドキュメントを読んで納得できるタイプの人と
実際に自分で罠にはまってみないと納得できないタイプの人がいる。
自分が後者だと思うなら一度Cで苦しむのがいいんじゃないかな。そうじゃないなら不要。
実際に自分で罠にはまってみないと納得できないタイプの人がいる。
自分が後者だと思うなら一度Cで苦しむのがいいんじゃないかな。そうじゃないなら不要。
983デフォルトの名無しさん
2020/08/21(金) 00:12:22.78ID:NOJ3NXTi だいたいドキュメントを鵜呑みにして罠にはまる
984デフォルトの名無しさん
2020/08/21(金) 03:22:09.47ID:gX4UqW46 RustってC/C++の代替って言うけどそもそも今時Cって使う?
趣味で使ってる言語の1位がRustだって記事もあったけどCで何作るの?
なんでRustがこんなに人気なのか理解できない
趣味で使ってる言語の1位がRustだって記事もあったけどCで何作るの?
なんでRustがこんなに人気なのか理解できない
985デフォルトの名無しさん
2020/08/21(金) 10:06:09.07ID:x9AY+WVq Linuxの基本的なコマンド(ls,grep等)を高機能にした代替コマンドがよくRustで作られてる
986デフォルトの名無しさん
2020/08/21(金) 18:18:06.15ID:hY6Ml5La987デフォルトの名無しさん
2020/08/21(金) 18:48:37.51ID:taULJ50I よく勘違いされることであるが、Cが昔から使いこなせてると思ってる人は、
単にバグに気付いてないだけだったりする。
真面目な話、組み込み系のシニアエンジニアにありがち。
オフラインの家電やってる頃は良かったんだろうけど、
ネットに接続とかやるとたいていやらかす。
単にバグに気付いてないだけだったりする。
真面目な話、組み込み系のシニアエンジニアにありがち。
オフラインの家電やってる頃は良かったんだろうけど、
ネットに接続とかやるとたいていやらかす。
988デフォルトの名無しさん
2020/08/21(金) 20:12:18.80ID:r2LsFpPg Cでマルチスレッド書けって言われてもバグる自信しか無いわ
C製ツールをRustで書き直したものはマルチスレッド化して高速化してるわけだしな
C製ツールをRustで書き直したものはマルチスレッド化して高速化してるわけだしな
989デフォルトの名無しさん
2020/08/21(金) 20:57:32.34ID:awVkHdGE LinuxカーネルハッカーというCの超ベテランからも
LinuxにRustも使いたいという話が出るくらい
LinuxにRustも使いたいという話が出るくらい
990デフォルトの名無しさん
2020/08/21(金) 21:03:56.70ID:JrVTIgi/ C使えるけど気苦労多いしRustの方が良い
Cを積極的に使う理由は少ない
Cを積極的に使う理由は少ない
991デフォルトの名無しさん
2020/08/21(金) 21:20:19.48ID:psrfcNr7 単に文字列扱うだけでめんどくさくなって
「仕様削ってintにしていい?」と言いたくなるのがC
「仕様削ってintにしていい?」と言いたくなるのがC
992デフォルトの名無しさん
2020/08/21(金) 22:15:47.76ID:wnXs3Jul993デフォルトの名無しさん
2020/08/21(金) 22:26:40.07ID:JrVTIgi/ 逆にCの代替になる必要はないと思う
CとのFFIは不自由なくできるわけで
むしろFFIが不自由なC++の代替にはなりづらいと思う
CとのFFIは不自由なくできるわけで
むしろFFIが不自由なC++の代替にはなりづらいと思う
994デフォルトの名無しさん
2020/08/21(金) 22:39:33.13ID:7UnAdk+W Cの代替ってのは別にCの用途すべてを置き換えうるって意味じゃないでしょ
ripgrepとか見れば十分Cの代替と言える
ripgrepとか見れば十分Cの代替と言える
995デフォルトの名無しさん
2020/08/21(金) 23:03:52.36ID:QT6UwXc0 例えばQEMUなんかは既存のCの書き直しは大変過ぎるからやらないけど、
新規開発のデバイスエミュレーションコードはRustでって言ってるね。
そういう代替の仕方もあると思う。
新規開発のデバイスエミュレーションコードはRustでって言ってるね。
そういう代替の仕方もあると思う。
996デフォルトの名無しさん
2020/08/22(土) 03:28:45.96ID:MH6yoyVU >>989
その人が、凄腕プログラマーとは限らないが。
その人が、凄腕プログラマーとは限らないが。
997デフォルトの名無しさん
2020/08/22(土) 09:45:03.68ID:YOeBtImF Cの代替はD
998デフォルトの名無しさん
2020/08/22(土) 09:49:22.85ID:+2o9Uv3C >>996
日本語読めないんだね
日本語読めないんだね
999デフォルトの名無しさん
2020/08/22(土) 10:58:14.06ID:oUSNiZjo Linuxのカーネルハッカーが、凄腕プログラマとは限らないと言っているんだ。
プログラマの世界は、レベルの差が大きいから、その程度では凄腕には
分類されない。
例えば、VzEditorのc.mosさんは、その程度ではなかった。
プログラマの世界は、レベルの差が大きいから、その程度では凄腕には
分類されない。
例えば、VzEditorのc.mosさんは、その程度ではなかった。
1000デフォルトの名無しさん
2020/08/22(土) 11:13:12.20ID:+2o9Uv3C >>999
お前よりはカーネルハッカーの方が腕も頭も良さそうだな
お前よりはカーネルハッカーの方が腕も頭も良さそうだな
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 210日 23時間 25分 20秒
新しいスレッドを立ててください。
life time: 210日 23時間 25分 20秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【STARTO ENTERTAINMENT】timelesz篠塚大輝『大きな古時計』替え歌一発ギャグ「今はもう動かない おじいさんにトドメ~♪」が波紋 [Ailuropoda melanoleuca★]
- 【社会】40代以上のおじさん・おばさんは叩いてオッケーという風潮はなぜ加速したのか [七波羅探題★]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- ラーメン屋「日高屋が安いせいで客が来ない!日高屋はもっと値上げしろ!」 [449534113]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【悲報】オックスフォード大学「日本で影響力のある人」ランキングを公表。1位西村博之氏、2位堀江貴文氏、3位高橋洋一氏 [566475398]
