Mozillaがリリースした、プログラミング言語「Rust」について語るスレです。
http://www.rust-lang.org/
https://github.com/rust-lang/rust
Servo
https://servo.org/
https://github.com/servo/servo
◆前スレ
プログラミング言語 Rust 2
http://echo.2ch.net/test/read.cgi/tech/1478023960
探検
プログラミング言語 Rust 3 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2017/05/21(日) 14:04:29.55ID:9L9dm7b/520デフォルトの名無しさん
2017/08/11(金) 05:26:24.27ID:oTwda99v >>519
いざ言われてみるとstructで参照を持つのってどんなときか思いつかんのだけど
いざ言われてみるとstructで参照を持つのってどんなときか思いつかんのだけど
521デフォルトの名無しさん
2017/08/11(金) 07:59:32.16ID:KiXisjXW じゃあまずlifetimeについて考える前に、参照のメリット/デメリットについて考えような
公式サイトのドキュメント読んでこい
公式サイトのドキュメント読んでこい
522デフォルトの名無しさん
2017/08/11(金) 09:42:12.68ID:oTwda99v c++だと参照保持すると生存期間管理ないからあぶないからやらない
スマートポインタ使う
そのへんの感覺の違いがまだなれない
スマートポインタ使う
そのへんの感覺の違いがまだなれない
523デフォルトの名無しさん
2017/08/11(金) 13:31:10.83ID:wKLRpp+C impl Traitがstableに入ったらどうなるか分からないけど、MapとかFilterとかがstructに参照+独自データって形になってるよ
あとはCharIndicesとか。実際のソースはちょいと違うけど元のデータへの参照+と現在位置っていう形になってる
あとはCharIndicesとか。実際のソースはちょいと違うけど元のデータへの参照+と現在位置っていう形になってる
524デフォルトの名無しさん
2017/08/11(金) 23:09:32.05ID:wLCu2iAZ 昨日Slackに参加した人たちはお前らって認識で合ってる?
525デフォルトの名無しさん
2017/08/11(金) 23:41:41.62ID:lyr4XUnD ようはfat pointerでしょ
526デフォルトの名無しさん
2017/08/12(土) 12:16:25.41ID:IzeoJwWv コンパイル済みのバイナリパッケージを公開してほしいけどそういうのは実現可能ではない?
527デフォルトの名無しさん
2017/08/12(土) 18:35:23.01ID:dKEWL6WP 例えばripgrepのコンパイル済みのバイナリパッケージ
ttps://github.com/BurntSushi/ripgrep/releases/tag/0.5.2
リリースビルドしたバイナリをzipなりでパッケージングすれば良いんでね
ttps://github.com/BurntSushi/ripgrep/releases/tag/0.5.2
リリースビルドしたバイナリをzipなりでパッケージングすれば良いんでね
528デフォルトの名無しさん
2017/08/12(土) 21:37:32.89ID:YDSzcZF8 Pathがすげー使いづらいんだけどなんでなの
529デフォルトの名無しさん
2017/08/12(土) 22:36:26.03ID:4PGg+vlK >>528
具体的にどのあたりが使いづらいと思っているの?
具体的にどのあたりが使いづらいと思っているの?
530デフォルトの名無しさん
2017/08/12(土) 22:57:47.92ID:Lzx+EbMy >>527
cargoにそんな感じのサブコマンドあった気がする
cargoにそんな感じのサブコマンドあった気がする
531デフォルトの名無しさん
2017/08/13(日) 04:17:55.12ID:oa7ekDLN PathはPath::new(&str)が参照を返すから使いづらい(参照を使いこなせない)
PathBuf使えば楽になったよ!
PathBuf使えば楽になったよ!
532デフォルトの名無しさん
2017/08/13(日) 08:43:10.09ID:f+gGM+v+533デフォルトの名無しさん
2017/08/13(日) 13:14:25.96ID:3acTHEGf >>532
>返り値で返せないとか
>引数の文字列のライフタイムで怒られる
fn file_stem<'a, P: AsRef<Path>+?Sized>(path: &'a P) -> Option<&'a OsStr> {
let path = path.as_ref();
path.file_stem()
}
これじゃダメ?
>PathBufすると変換いるしめんどい
to_ownedやintoするのもめんどくさけりゃ、もう死んでしまえ
>返り値で返せないとか
>引数の文字列のライフタイムで怒られる
fn file_stem<'a, P: AsRef<Path>+?Sized>(path: &'a P) -> Option<&'a OsStr> {
let path = path.as_ref();
path.file_stem()
}
これじゃダメ?
>PathBufすると変換いるしめんどい
to_ownedやintoするのもめんどくさけりゃ、もう死んでしまえ
534デフォルトの名無しさん
2017/08/13(日) 13:51:20.44ID:TkYKFb/H こんな使いづらさでしょ
fn path<'a>(name: &str, ext: &str) -> &'a Path {
Path::new(&format!("{}.{}", name, ext))
// error[E0597]: borrowed value does not live long enough
}
まぁこれも死んでしまえ事例ではあるが
別所にOsStrの所有権(ライフタイム)がある場合に参照だけで済ますためのPathなので
動的に生成したOsStrでPath(参照)だけを返せると思うなよバーカというね
fn path<'a>(name: &str, ext: &str) -> &'a Path {
Path::new(&format!("{}.{}", name, ext))
// error[E0597]: borrowed value does not live long enough
}
まぁこれも死んでしまえ事例ではあるが
別所にOsStrの所有権(ライフタイム)がある場合に参照だけで済ますためのPathなので
動的に生成したOsStrでPath(参照)だけを返せると思うなよバーカというね
535デフォルトの名無しさん
2017/08/13(日) 13:56:05.57ID:LyaOwRfj >>533
いきなりドラえもんになるのやめろ
いきなりドラえもんになるのやめろ
536デフォルトの名無しさん
2017/08/13(日) 16:54:45.71ID:4uuls5D8 impl Traitっていつstableはいるんだっけ?
537デフォルトの名無しさん
2017/08/13(日) 22:34:46.55ID:3acTHEGf538デフォルトの名無しさん
2017/08/13(日) 22:46:00.09ID:r6u293xs owned valueとborrowed valueの区別がついてないだけじゃん
539デフォルトの名無しさん
2017/08/13(日) 23:14:52.73ID:3acTHEGf まあ、Sizedと!Sized (DST)の区別がつきづらいってのもあるとは思う
strとString然り、[T]とVec<T>然り、OsStrとOsString、トレイトオブジェクト、そしてPathとPathBuf……
strとString然り、[T]とVec<T>然り、OsStrとOsString、トレイトオブジェクト、そしてPathとPathBuf……
540デフォルトの名無しさん
2017/08/14(月) 01:43:35.30ID:tyQzDLaM アマグラマの書き散らした名前空間みたいできついな
541デフォルトの名無しさん
2017/08/14(月) 07:06:13.75ID:HJwH3qkh542デフォルトの名無しさん
2017/08/14(月) 09:35:01.13ID:59zJ3Di9 >>541
>Pathのまま返すにはどうしたらいいの?
ライフタイムとか関係なく、!Sizedな型はそのまま返すなんてことはできない
コンパイルタイムにサイズが分からないからランタイムでサイズ情報を持つfat pointer経由でしか扱えない
(https://doc.rust-lang.org/book/first-edition/unsized-types.html)
所有権を持った値として返したいのならそのownedなバージョン(今回はPathBuf)かボックス化された状態(PathBuf::into_boxed_pathで得たBox<Path>)を使うしかない
ああ、>>532の「返り値で返せないとか」の意味がようやく分かった。確かにその通りだ。別の型で返す必要がある
>Pathのまま返すにはどうしたらいいの?
ライフタイムとか関係なく、!Sizedな型はそのまま返すなんてことはできない
コンパイルタイムにサイズが分からないからランタイムでサイズ情報を持つfat pointer経由でしか扱えない
(https://doc.rust-lang.org/book/first-edition/unsized-types.html)
所有権を持った値として返したいのならそのownedなバージョン(今回はPathBuf)かボックス化された状態(PathBuf::into_boxed_pathで得たBox<Path>)を使うしかない
ああ、>>532の「返り値で返せないとか」の意味がようやく分かった。確かにその通りだ。別の型で返す必要がある
543デフォルトの名無しさん
2017/08/14(月) 09:54:46.27ID:HJwH3qkh ええぇ、今までPathが返り値で返せないの意味を分かってなかったのかw
!Sizedな型は+Sizedとかで型サイズを固定させて返すとか頑張るんでしょ、Pathは出来なかった気がするけど
PathBufはDeref type Pathがあるからまぁなんとか
str, String等の命名規則がStr, StrBufじゃないのは気に入らん、みたいなのは分からいでもない
なんか歴史的背景があるんだろうけど、考えるのが面倒でそのまま受け入れてる
!Sizedな型は+Sizedとかで型サイズを固定させて返すとか頑張るんでしょ、Pathは出来なかった気がするけど
PathBufはDeref type Pathがあるからまぁなんとか
str, String等の命名規則がStr, StrBufじゃないのは気に入らん、みたいなのは分からいでもない
なんか歴史的背景があるんだろうけど、考えるのが面倒でそのまま受け入れてる
544デフォルトの名無しさん
2017/08/14(月) 09:56:58.67ID:3NSMgreF 習いたての頃に[u8]を引数に取ろうとして躓きまくったのを思い出す
そういやこれって何でわざわざコンパイラー組み込みでファットポインターを定義してるんだ?
struct Path<'a> { start: *mut (), end: *mut (), marker: PhantomData<&'a PathBuf> }じゃダメなのか?
そういやこれって何でわざわざコンパイラー組み込みでファットポインターを定義してるんだ?
struct Path<'a> { start: *mut (), end: *mut (), marker: PhantomData<&'a PathBuf> }じゃダメなのか?
545デフォルトの名無しさん
2017/08/14(月) 10:30:03.78ID:59zJ3Di9 >>544
それだとimpl AsRef<Path> for PathBufとかが出来ない
それだとimpl AsRef<Path> for PathBufとかが出来ない
546デフォルトの名無しさん
2017/08/14(月) 10:53:05.45ID:fyv2iRf4 PathがSizedじゃないってのが初学者的にめんくらったわ
strと同じだと思えば理解できた
strと同じだと思えば理解できた
547デフォルトの名無しさん
2017/08/14(月) 10:54:47.32ID:fyv2iRf4 >>537
nightlyって1.21って出るけどそこに入るわけじゃないのね
nightlyって1.21って出るけどそこに入るわけじゃないのね
548デフォルトの名無しさん
2017/08/14(月) 15:20:15.52ID:xd4YqYEd549デフォルトの名無しさん
2017/08/15(火) 01:22:49.60ID:Kx+225Ge550デフォルトの名無しさん
2017/08/15(火) 05:20:52.55ID:qX6sO+hu &Pathを関数戻り値で返せないのにライフタイム関係ないって子たちはエラー内容見えないのか
// error[E0597]: borrowed value does not live long enough
サマリーだけでlifetime関係ないって思い込んでるならE0597の詳細見て理解しような
https://doc.rust-lang.org/error-index.html
// error[E0597]: borrowed value does not live long enough
サマリーだけでlifetime関係ないって思い込んでるならE0597の詳細見て理解しような
https://doc.rust-lang.org/error-index.html
551デフォルトの名無しさん
2017/08/15(火) 05:38:14.01ID:tN8D0FqC ちょっと聞きたいんだけどrustのマクロって裏でどういうコードが生成れてるか分かる機能ってあります?
Cのプリプロセッサなら生成コードが出力できるけど、、、
Cのプリプロセッサなら生成コードが出力できるけど、、、
552デフォルトの名無しさん
2017/08/15(火) 09:18:04.23ID:cM0t4sQL Webにいるプログラマって、マサカリとかに代表されるように人格が狂ってる人多いよね。正しければ正義的な。
2ちゃんはさらにひどいけど、そうじゃなくても。
実社会でプログラマの地位が認められてないからかなぁ。
2ちゃんはさらにひどいけど、そうじゃなくても。
実社会でプログラマの地位が認められてないからかなぁ。
553デフォルトの名無しさん
2017/08/15(火) 09:27:06.48ID:O7/Y4aw2 >>550
&PathじゃなくてPathを返すって話だよ
Path: !Sizedだから参照を経由しない形では返せない(fn() -> Pathと書けない)というお話ね
>error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied in `std::path::Path`
こういう流れを見ると本当にDSTは理解されづらいんだなあと思う
>>551
Nightlyで、rustc -Z unstable-options --pretty=expanded foo.rs
これのラッパとしてcargo-expandというものもある
https://github.com/dtolnay/cargo-expand
&PathじゃなくてPathを返すって話だよ
Path: !Sizedだから参照を経由しない形では返せない(fn() -> Pathと書けない)というお話ね
>error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied in `std::path::Path`
こういう流れを見ると本当にDSTは理解されづらいんだなあと思う
>>551
Nightlyで、rustc -Z unstable-options --pretty=expanded foo.rs
これのラッパとしてcargo-expandというものもある
https://github.com/dtolnay/cargo-expand
554デフォルトの名無しさん
2017/08/15(火) 09:32:50.69ID:qX6sO+hu Path:newが&Pathを返すというstdライブラリ仕様を言及してたのかよwww
そりゃ失礼、そんな所よりそれをどうやって使うかを話してるつもりだったわ
そりゃ失礼、そんな所よりそれをどうやって使うかを話してるつもりだったわ
555デフォルトの名無しさん
2017/08/15(火) 17:22:31.52ID:bUHuOZJE newがPathを返すと思ってたわ
あはは
あはは
556デフォルトの名無しさん
2017/08/15(火) 17:26:22.04ID:L9Yq17PV あはは
557デフォルトの名無しさん
2017/08/15(火) 18:11:07.59ID:qRVErxIb あはははは
558デフォルトの名無しさん
2017/08/15(火) 18:12:13.59ID:wgr8KXHg もしかして他にもnewで&返すのあるの?
559デフォルトの名無しさん
2017/08/15(火) 18:29:55.70ID:MDS+g102 ワロス
560デフォルトの名無しさん
2017/08/15(火) 18:34:48.29ID:O7/Y4aw2 >>558
標準ライブラリのパブリックな型ではOsStrくらいじゃないかな
from系の関数も含むのなら、std::slice::from_raw_partsとかstd::str::from_utf8とかもある
標準ライブラリ外のクレートでもstrに対するラッパとかでそういうのがあった気がする
標準ライブラリのパブリックな型ではOsStrくらいじゃないかな
from系の関数も含むのなら、std::slice::from_raw_partsとかstd::str::from_utf8とかもある
標準ライブラリ外のクレートでもstrに対するラッパとかでそういうのがあった気がする
561デフォルトの名無しさん
2017/08/16(水) 01:13:42.55ID:lhJRoj0R >>554
オレも値受け取った後の話だと思ってたわ
オレも値受け取った後の話だと思ってたわ
562デフォルトの名無しさん
2017/08/16(水) 01:18:30.66ID:lhJRoj0R ごめん言い忘れたぜ。
>> 558
fn new<S: AsRef<T> + ?Sized>(s: &S) -> &Self
に一般化出来るの全部。transmuteしてるだけだもん。
>> 558
fn new<S: AsRef<T> + ?Sized>(s: &S) -> &Self
に一般化出来るの全部。transmuteしてるだけだもん。
563デフォルトの名無しさん
2017/08/16(水) 01:35:45.19ID:Vj5dC5z1 >>562
これ系の実装がやたら低レベルなのってどうにかならんもんなのかねえ……
これ系の実装がやたら低レベルなのってどうにかならんもんなのかねえ……
564デフォルトの名無しさん
2017/08/16(水) 03:04:04.19ID:Tcbyhi06 とは言え、Pathみたいにnewtypeパターンでnewtypeの元の型の参照からnewtypeの型の参照を得るケースなんてそう多くないからな(というかDSTくらいでしかやらない)
transmuteもやむなしだろう
transmuteもやむなしだろう
565デフォルトの名無しさん
2017/08/16(水) 04:03:28.36ID:1RQ5dDrL newなんて普通過ぎる名前が悪い
sliceよろしくfromにしておけばよかったんだ
sliceよろしくfromにしておけばよかったんだ
566デフォルトの名無しさん
2017/08/16(水) 07:12:51.51ID:Ip1XZB1d >>551
https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/macros.html#マクロをデバッグする
> マクロの展開結果を見るには、 rustc --pretty expanded を実行して下さい。
https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/macros.html#マクロをデバッグする
> マクロの展開結果を見るには、 rustc --pretty expanded を実行して下さい。
567デフォルトの名無しさん
2017/08/16(水) 10:55:53.36ID:Agtz0DvI IntelliJ Rust Pluginのエディタが型表示をヒントとして表示するようになってクッソウゼェw
一瞬便利かなと思ったけどやり過ぎだと思ってオフにしたった
futuresでチェーンしてると型名が長すぎて実態のコードが画面外に追いやられてたわ
変数名にフォーカスしたら型名表示くらいのFRやPRは出てないものかしら
一瞬便利かなと思ったけどやり過ぎだと思ってオフにしたった
futuresでチェーンしてると型名が長すぎて実態のコードが画面外に追いやられてたわ
変数名にフォーカスしたら型名表示くらいのFRやPRは出てないものかしら
568デフォルトの名無しさん
2017/08/16(水) 11:05:25.77ID:s5nUB7nh >>567
その機能を持ってきたJavaだと型名が短いからいいんだけどね
その機能を持ってきたJavaだと型名が短いからいいんだけどね
569デフォルトの名無しさん
2017/08/16(水) 11:50:59.59ID:11a+64I1 みんな何でRust書いてるの?IntelliJ派?
570デフォルトの名無しさん
2017/08/16(水) 17:55:39.36ID:5vWhS1NV emacs
571デフォルトの名無しさん
2017/08/16(水) 17:56:12.79ID:Vj5dC5z1 Vim一択
572デフォルトの名無しさん
2017/08/16(水) 17:58:42.50ID:5vWhS1NV Path(PathBuff)に拡張子を追加するにはどしたらいいすか
f.txtをf.txt.zipにするてきな。
f.txtをf.txt.zipにするてきな。
573デフォルトの名無しさん
2017/08/16(水) 18:27:36.87ID:ObQbU6V8 ggrksなので雑に答えてみる
let path = Path::new("f.txt");
let new_name = format!("{}.{}", path.to_str().unwrap(), "zip");
let new_path = Path::new(&new_name);
print!("{:?}", new_path);
これ以上雑な実装はねーだろ(チラッチラッ
let path = Path::new("f.txt");
let new_name = format!("{}.{}", path.to_str().unwrap(), "zip");
let new_path = Path::new(&new_name);
print!("{:?}", new_path);
これ以上雑な実装はねーだろ(チラッチラッ
574デフォルトの名無しさん
2017/08/16(水) 18:47:37.19ID:U6ziTncO やっぱそーなっちゃうんですねー。
ありがとうございました。
さすがにこれ以上エレガントなのはないですね
ありがとうございました。
さすがにこれ以上エレガントなのはないですね
575デフォルトの名無しさん
2017/08/16(水) 18:48:57.93ID:Vj5dC5z1 元から&mut Stringや&mut OsStringを持っていてそれを&Pathに変換するような場面なら、素直にStringやOsStringの時点でpushとかで加工した方が手軽だと思う
OwnedなPathBufしか持っていないのなら一旦OsStringに変換してから拡張子を足してPathBufに戻す
&Pathや&strしか持っていないのなら、そもそもその状態では書き換えようがないからto_ownedする
&mut PathBufしか持っていないのなら、多分設計が良くない。&mut OsStringを受け取れるようにできないか検討しよう
OwnedなPathBufしか持っていないのなら一旦OsStringに変換してから拡張子を足してPathBufに戻す
&Pathや&strしか持っていないのなら、そもそもその状態では書き換えようがないからto_ownedする
&mut PathBufしか持っていないのなら、多分設計が良くない。&mut OsStringを受け取れるようにできないか検討しよう
576デフォルトの名無しさん
2017/08/16(水) 19:03:14.68ID:PvRs7uXf エディタわりとバラバラなのな
俺はVimだけど何となく気になった
俺はVimだけど何となく気になった
577デフォルトの名無しさん
2017/08/16(水) 19:22:40.51ID:ObQbU6V8578デフォルトの名無しさん
2017/08/16(水) 19:42:34.81ID:Vj5dC5z1 >>577
1番目
fn f(path: &mut OsString) -> &Path {
path.push(".zip");
Path::new(path)
}
let mut path = "f.txt".into();
assert_eq!(Some("f.txt.zip"), f(&mut path).to_str());
2番目(assertionは省略)
fn g(path: PathBuf) -> PathBuf {
let mut path: OsString = path.into();
path.push(".zip");
path.into()
}
3番目
fn h(path: &Path) -> PathBuf {
let mut path: OsString = path.into();
path.push(".zip");
path.into()
}
ついでに4番目(実際に使うべきでないが)
fn i(path: &mut PathBuf) {
unsafe {
(*(path as *mut _ as *mut OsString)).push(".zip")
};
}
1番目
fn f(path: &mut OsString) -> &Path {
path.push(".zip");
Path::new(path)
}
let mut path = "f.txt".into();
assert_eq!(Some("f.txt.zip"), f(&mut path).to_str());
2番目(assertionは省略)
fn g(path: PathBuf) -> PathBuf {
let mut path: OsString = path.into();
path.push(".zip");
path.into()
}
3番目
fn h(path: &Path) -> PathBuf {
let mut path: OsString = path.into();
path.push(".zip");
path.into()
}
ついでに4番目(実際に使うべきでないが)
fn i(path: &mut PathBuf) {
unsafe {
(*(path as *mut _ as *mut OsString)).push(".zip")
};
}
579デフォルトの名無しさん
2017/08/16(水) 19:56:17.83ID:YfsrWVwz めちゃくちゃエレガントになったな(白目)
580デフォルトの名無しさん
2017/08/16(水) 20:11:43.78ID:ObQbU6V8 1〜3がすごく無駄なバリエーションでワロタ
まとめてこれでいいじゃん, 分けて挙げた意味あるのかいな
let path = f(PathBuf::from("f.txt"));
let path = f(Path::new("f.txt"));
let path = f(OsString::from("f.txt"));
fn f<P: AsRef<Path>>(path: P) -> PathBuf {
let mut path: OsString = path.as_ref().into();
path.push(".zip");
path.into()
}
まとめてこれでいいじゃん, 分けて挙げた意味あるのかいな
let path = f(PathBuf::from("f.txt"));
let path = f(Path::new("f.txt"));
let path = f(OsString::from("f.txt"));
fn f<P: AsRef<Path>>(path: P) -> PathBuf {
let mut path: OsString = path.as_ref().into();
path.push(".zip");
path.into()
}
581デフォルトの名無しさん
2017/08/16(水) 20:16:19.25ID:eiUsQzcr cloneする奴としない奴を同列に語るのはどうなんだって感じだがな
582デフォルトの名無しさん
2017/08/16(水) 20:18:00.24ID:ObQbU6V8 4を頑張れば>>573を超える雑な実装にできる可能性がありそうだけど無理かなぁ
まぁ無理か・・・
まぁ無理か・・・
583デフォルトの名無しさん
2017/08/16(水) 20:27:22.87ID:eiUsQzcr つまり、雑さ選手権であると言う事を見落とした事が>>575の敗因か()
584デフォルトの名無しさん
2017/08/16(水) 20:36:20.89ID:8AGyDDIv PathBuf::pushじゃいかんのか
let buf = path.to_parh_buf();
buf.push(".zip");
buf.as_ref()
一番良いのはPathの元になったOwnedな型にpushすることだと思うが
let buf = path.to_parh_buf();
buf.push(".zip");
buf.as_ref()
一番良いのはPathの元になったOwnedな型にpushすることだと思うが
585デフォルトの名無しさん
2017/08/16(水) 20:36:47.76ID:8AGyDDIv let mut にするの忘れた
586デフォルトの名無しさん
2017/08/16(水) 20:38:34.55ID:Vj5dC5z1 let mut buf: PathBuf = "f.txt".into();
buf.push(".zip");
println!("{:?}", buf); // => "f.txt/.zip"
buf.push(".zip");
println!("{:?}", buf); // => "f.txt/.zip"
587デフォルトの名無しさん
2017/08/16(水) 20:38:39.16ID:ObQbU6V8 >>581
関数f内でのPath/PathBufのメモリ確保処理に差はないから必要なら後からas_pathでもしたらいいんじゃね
むしろas_refやintoのオーバーヘッドを気にすべきかのう, 100万回くらいループしたら1秒くらいの差が出るかも?
関数f内でのPath/PathBufのメモリ確保処理に差はないから必要なら後からas_pathでもしたらいいんじゃね
むしろas_refやintoのオーバーヘッドを気にすべきかのう, 100万回くらいループしたら1秒くらいの差が出るかも?
588デフォルトの名無しさん
2017/08/16(水) 20:39:36.49ID:8AGyDDIv 失礼、PathBuf.pushだと/がついてしまうのか
589デフォルトの名無しさん
2017/08/16(水) 20:44:06.60ID:kNGkTZBw だれも>>550に肝心なこと言ってやらないのな。
>>550
関数が&Path返すだけじゃE0597はでねぇのよ。たとえば>>534のは
>fn path<'a>(name: &str, ext: &str) -> &'a Path {
>Path::new(&format!("{}.{}", name, ext))
>}
&format!("{}.{}", name, ext)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
この中でnameとextをdropするからE0597出るんだよ。
まあ、罠だけど。ただの面倒くさいっていう見本みたいだし。
借用を関数の中で結合して返すってのが潜在的に危険だから
やり様は色々あるけど↓が一番簡単。
ttps://play.rust-lang.org/?gist=e4937a92f292952a620eaa7bffa51c21&version=stable
>>563
無理、rustはこういう型シノニムを構造体でラップしたfat pointerとして定義するからtransmuteは必要になる。
こういうnewtypeがやりたいのはunsafe消すこと。
名前からtransmuteしてるようには見えないから名前が悪いのよ。
>>565
from/intoは使い方決まってる
>>550
関数が&Path返すだけじゃE0597はでねぇのよ。たとえば>>534のは
>fn path<'a>(name: &str, ext: &str) -> &'a Path {
>Path::new(&format!("{}.{}", name, ext))
>}
&format!("{}.{}", name, ext)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
この中でnameとextをdropするからE0597出るんだよ。
まあ、罠だけど。ただの面倒くさいっていう見本みたいだし。
借用を関数の中で結合して返すってのが潜在的に危険だから
やり様は色々あるけど↓が一番簡単。
ttps://play.rust-lang.org/?gist=e4937a92f292952a620eaa7bffa51c21&version=stable
>>563
無理、rustはこういう型シノニムを構造体でラップしたfat pointerとして定義するからtransmuteは必要になる。
こういうnewtypeがやりたいのはunsafe消すこと。
名前からtransmuteしてるようには見えないから名前が悪いのよ。
>>565
from/intoは使い方決まってる
590デフォルトの名無しさん
2017/08/16(水) 20:45:56.00ID:eiUsQzcr >>587
Path::newやas_ref、intoは単に型システム上の操作であってnoopなのでは(検証してない)
だってPathやらPathBufやらはOsStrやOsStringに対する単なるnewtypeでしょ
Path::newやas_ref、intoは単に型システム上の操作であってnoopなのでは(検証してない)
だってPathやらPathBufやらはOsStrやOsStringに対する単なるnewtypeでしょ
591デフォルトの名無しさん
2017/08/16(水) 20:54:34.33ID:8AGyDDIv let mut buf = PathBuf::from("hoge.txt");
let mut ext = buf.extension().map(OsString::from).unwap_or(OsString::new);
ext.push(".zip");
buf.set_extension(&ext);
let mut ext = buf.extension().map(OsString::from).unwap_or(OsString::new);
ext.push(".zip");
buf.set_extension(&ext);
592デフォルトの名無しさん
2017/08/16(水) 21:03:54.32ID:8AGyDDIv593デフォルトの名無しさん
2017/08/16(水) 21:07:58.66ID:ObQbU6V8 fn f<T: Trait>(t: T) のトレイトによる分岐はnoopだけど、as_ref, intoはnoopとは限らんよねぇ
impl AsRef, Intoの実装でゴチャゴチャ処理するモノもあるだろうし
Path, PathBufに限ってはinnerを返すだけっぽいからコンパイラによる最適化でnoopになるかな
2,3回前のリリースでもコンパイラ最適化を抜本見直ししてたし、どうなってるかワカラン(自分も検証する気ない)
impl AsRef, Intoの実装でゴチャゴチャ処理するモノもあるだろうし
Path, PathBufに限ってはinnerを返すだけっぽいからコンパイラによる最適化でnoopになるかな
2,3回前のリリースでもコンパイラ最適化を抜本見直ししてたし、どうなってるかワカラン(自分も検証する気ない)
594デフォルトの名無しさん
2017/08/16(水) 21:51:24.68ID:8AGyDDIv AsRefはcheapな型変換を実装するためのtraitだし、as_refは常にほぼnoopだと言って良いと思う
https://doc.rust-lang.org/std/convert/trait.AsRef.html
https://doc.rust-lang.org/std/convert/trait.AsRef.html
595デフォルトの名無しさん
2017/08/16(水) 22:57:30.93ID:Agtz0DvI 雑に拡張子生成部のワンライナーを目指した(改行がないとは言っていない
let new_ext = ".zip";
let mut buf = PathBuf::from("hoge.txt");
let ext = buf.extension()
.map(OsString::from).map(|mut ext| {ext.push(new_ext); ext})
.unwrap_or(new_ext.into());
buf.set_extension(&ext);
let new_ext = ".zip";
let mut buf = PathBuf::from("hoge.txt");
let ext = buf.extension()
.map(OsString::from).map(|mut ext| {ext.push(new_ext); ext})
.unwrap_or(new_ext.into());
buf.set_extension(&ext);
596デフォルトの名無しさん
2017/08/17(木) 18:40:58.78ID:8HfS9wXv std::path::Componentsのimpl AsRef<Path>みたいな地雷もいるけどな! > as_refがnoop
地雷を踏み抜かないように使いたい所存
地雷を踏み抜かないように使いたい所存
597デフォルトの名無しさん
2017/08/18(金) 18:00:28.47ID:XVXUXs+1 メンバ変数の参照を返すイテレータモドキ
https://play.rust-lang.org/?gist=42ce623d69717a8acdc7736d6d624f60
これに Iterator トレイトを実装させたいのだが、関連型 Item の定義が上手く行かず困っている。
関連型について
type Item = <&T>; とするとライフタイムが必要だと出る。
しかし
impl<'a, T> Iterator for Foo<T> {
type Item = Option<&'a T>;
...
とか
PhantomData 使ったりしてみた https://play.rust-lang.org/?gist=5b127531f2b93a1a9a9143de86ad2340
けど通らない。
どうすれば良いのだろう?
https://play.rust-lang.org/?gist=42ce623d69717a8acdc7736d6d624f60
これに Iterator トレイトを実装させたいのだが、関連型 Item の定義が上手く行かず困っている。
関連型について
type Item = <&T>; とするとライフタイムが必要だと出る。
しかし
impl<'a, T> Iterator for Foo<T> {
type Item = Option<&'a T>;
...
とか
PhantomData 使ったりしてみた https://play.rust-lang.org/?gist=5b127531f2b93a1a9a9143de86ad2340
けど通らない。
どうすれば良いのだろう?
598デフォルトの名無しさん
2017/08/18(金) 18:05:55.69ID:XVXUXs+1 ミス。
> type Item = Option
の Option<> は要りません。
> type Item = Option
の Option<> は要りません。
599デフォルトの名無しさん
2017/08/18(金) 18:07:34.29ID:LVQKp7rQ >>597
impl<'a, T> Iterator for &'a Fooじゃダメな理由とかある?
impl<'a, T> Iterator for &'a Fooじゃダメな理由とかある?
600デフォルトの名無しさん
2017/08/18(金) 18:17:10.82ID:XVXUXs+1 impl<'a,T> Iterator for &'a Foo<T> {
type Item = &'a T;
fn next(&mut self) -> Option<&T> {
Some(&self.x)
}
}
これはこれで error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements
エラーが出ます。
type Item = &'a T;
fn next(&mut self) -> Option<&T> {
Some(&self.x)
}
}
これはこれで error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements
エラーが出ます。
601デフォルトの名無しさん
2017/08/18(金) 18:20:10.90ID:LVQKp7rQ602デフォルトの名無しさん
2017/08/18(金) 18:35:09.68ID:XVXUXs+1 >>601
おお、出来ました! ありがとうございます。
a.next() ではなく (&a).next() となってしまうのが心残りです。
関連型 Item のライフタイム問題が無ければ素のコードで行けるのに、
何故こんなことになってしまうのか……
おお、出来ました! ありがとうございます。
a.next() ではなく (&a).next() となってしまうのが心残りです。
関連型 Item のライフタイム問題が無ければ素のコードで行けるのに、
何故こんなことになってしまうのか……
603デフォルトの名無しさん
2017/08/18(金) 19:24:37.05ID:LVQKp7rQ604デフォルトの名無しさん
2017/08/18(金) 19:31:38.24ID:zUkt3uOb ていうかあんまり本質的な問題ではないけどtakeを使うべき場面だな
605デフォルトの名無しさん
2017/08/18(金) 23:23:26.21ID:68PBtc02 Rustの2017年ロードマップの進捗状況
https://www.infoq.com/jp/news/2017/08/rust-2017-roadmap-six-months
https://www.infoq.com/jp/news/2017/08/rust-2017-roadmap-six-months
606デフォルトの名無しさん
2017/08/19(土) 00:07:19.34ID:gC1uMiLY >>592-594
変換系の命名規則はコストで決まってる。
ttps://rust-lang-nursery.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv
ただまだ質が悪いから準拠してこうぜ!ってのが2017のロードマップ。
変換系の命名規則はコストで決まってる。
ttps://rust-lang-nursery.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv
ただまだ質が悪いから準拠してこうぜ!ってのが2017のロードマップ。
607デフォルトの名無しさん
2017/08/19(土) 04:06:47.11ID:eOOMhS38 何で皆さんそんなにコピーがお嫌いなんですか
608デフォルトの名無しさん
2017/08/19(土) 08:31:32.98ID:BpKw1nHe Copyは良いがCloneは避けたい
Cloneどんどんやって良いようなプログラムならrustで書かなくても良い
Cloneどんどんやって良いようなプログラムならrustで書かなくても良い
609デフォルトの名無しさん
2017/08/19(土) 10:50:48.03ID:5Hm4My/o >>603
> Vecとかみたいに、&'a Foo<T>をラップするstruct Iter<'a, T>とfn iter(&self) -> Iter<'a, T>を作った方がエルゴノミクス的に良さそうではある
Slice のコードを参考にしてみた結果、Some(&v) じゃなくて Some(&*ptr) という unsafe な手法ですが、こんな感じで上手く行きました。
https://play.rust-lang.org/?gist=639045def9c07026e8b6b0267a9dae98
ありがとうございました。
> Vecとかみたいに、&'a Foo<T>をラップするstruct Iter<'a, T>とfn iter(&self) -> Iter<'a, T>を作った方がエルゴノミクス的に良さそうではある
Slice のコードを参考にしてみた結果、Some(&v) じゃなくて Some(&*ptr) という unsafe な手法ですが、こんな感じで上手く行きました。
https://play.rust-lang.org/?gist=639045def9c07026e8b6b0267a9dae98
ありがとうございました。
610デフォルトの名無しさん
2017/08/19(土) 10:56:56.32ID:i5Fk1Iv8 copyとcloneの違いって?
611デフォルトの名無しさん
2017/08/19(土) 14:19:36.24ID:zLcrLAmh error-chainのまともなサンプルがないんだけど、みんな使ってないのかな
612デフォルトの名無しさん
2017/08/19(土) 14:23:54.00ID:FnHzgZW7 crates.ioのreverse dependenciesが10ページを超えているようなcrateを「みんな使ってない」はずがない
GitHubのexamplesでなんやかんや事足りるからなあ
GitHubのexamplesでなんやかんや事足りるからなあ
613デフォルトの名無しさん
2017/08/19(土) 14:28:59.69ID:IJZoKA+S 「Notepad++」v7.5が公開、“LaTeX”や“Rust”、“Erlang”など19言語をサポート
http://forest.watch.impress.co.jp/docs/news/1076002.html
http://forest.watch.impress.co.jp/docs/news/1076002.html
614デフォルトの名無しさん
2017/08/19(土) 15:21:50.70ID:sXEKiJ8x error-chainてメインでしか使えない?
615デフォルトの名無しさん
2017/08/19(土) 15:24:47.15ID:sXEKiJ8x 日本語の記事もほぼないし
616デフォルトの名無しさん
2017/08/19(土) 15:47:44.15ID:nyFhS1vK テキストエディタも高機能な奴は起動が遅かったり動作が重い印象がある
617デフォルトの名無しさん
2017/08/19(土) 16:40:03.65ID:pL/zMRBl >>611
error-chain、なんか使いにくそうと勝手に思い込んでる
error-chain、なんか使いにくそうと勝手に思い込んでる
618デフォルトの名無しさん
2017/08/19(土) 16:53:30.74ID:FnHzgZW7 >>615
むしろ、Rust界隈でまともな日本語記事とやらがどれだけあるのやら……
むしろ、Rust界隈でまともな日本語記事とやらがどれだけあるのやら……
619デフォルトの名無しさん
2017/08/19(土) 23:55:33.96ID:nyFhS1vK >>613
Notepad++ってちょっと重い。SakuraEditorより重いと思う。あとSDIで使えなかった気がする
Notepad++ってちょっと重い。SakuraEditorより重いと思う。あとSDIで使えなかった気がする
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 青森 緊急地震速報 [ぐれ★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★3 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★4 [蚤の市★]
- 【速報】衆院議員定数削減法案、自民・維新が今国会成立見送りで調整 [Hitzeschleier★]
- 高市首相、自民党が多額の企業・団体献金を必要な理由聞かれ「地域に密着した活動が非常に多い」と理解求める [蚤の市★]
- 青森・八戸市美術館『古代エジプト美術館展』、12月8日に発生した地震の影響により会期途中で閉幕を発表「展示品数点に損傷が確認」 [少考さん★]
- 【悲報】ホテル「高市早苗のせいで12月の売り上げがゼロになった😢」 [616817505]
- 地蔵 [268244553]
- 日本、高市が辞任しても日中関係を改善させられそうな首相候補がいなくて詰む [329271814]
- 中国「台湾は一つの中国」日本「台湾は一つの中国」高市「中国が武力により台湾を併合したら武力介入する」なにこれ? [472617201]
- 【乞食速報】epicで『ホグワーツレガシー』無料キター♪───O(´ん`)O────♪ [931948549]
- はてな民が気づく。「大金持ちしか味わえない娯楽って現代にない」 [858219337]
