[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2ch.scのread.cgiへ]
Update time : 06/17 08:49 / Filesize : 171 KB / Number-of Response : 660
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

プログラミング言語 Rust



1 名前:デフォルトの名無しさん [2012/01/25(水) 20:05:49.96 .net]
Mozillaがリリースした、プログラミング言語「Rust」について語るスレです。

www.rust-lang.org/

159 名前:デフォルトの名無しさん mailto:sage [2015/01/13(火) 22:27:52.83 ID:QfRKSulC.net]
関数からIteratorを返す方法が分かりません
具体的には型に何書いて良いか分からない

160 名前:デフォルトの名無しさん mailto:sage [2015/01/14(水) 00:27:11.46 ID:e9uoW40m.net]
>>158
Rustの良さの一つではあると思う
メモリモデルの問題で普通の関数型プログラミング言語と全く同じようには出来ない中で、なるべく関数型の良さを取り入れようという結果なんだろうな

161 名前:デフォルトの名無しさん mailto:sage [2015/01/14(水) 00:48:27.71 ID:MazRL5ri.net]
>>159
関数の中身によるけど、
戻り値書かなかった場合のコンパイルエラーで出てる型名コピペすればたぶんいけると思う

162 名前:デフォルトの名無しさん mailto:sage [2015/01/15(木) 20:50:25.52 ID:b84/qUeG.net]
言語が固まったらREPLの開発も再開するよね

163 名前:デフォルトの名無しさん mailto:sage [2015/01/15(木) 21:34:03.91 ID:E2BgZv7k.net]
RustでREPLはめんどくさそうだな
寿命とか
でっかいひとつのスコープって考えたら別にむずかしくはないのな

164 名前:デフォルトの名無しさん mailto:sage [2015/01/16(金) 14:15:52.84 ID:9+9TOoEF.net]
1.0.0-alpha をビルドしてるんだけど
configure に --libdir=/usr/lib64 を指定すると
lib.rs がコンパイルエラーになってしまう
前からこんなんだったっけ・・・

165 名前:デフォルトの名無しさん mailto:sage [2015/01/16(金) 22:33:39.21 ID:KEq1J0ex.net]
ここ最近の怒涛の変更はヤバい

166 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 00:15:44.35 ID:Wxv5Etsa.net]
clayもそうだったけど、llvm使った言語のビルドってすげー時間かかるのな。ナイトリービルド落とした方がええわ。

167 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 02:06:27.12 ID:CWvWtJ6X.net]
クロージャ周りが変更されまくってて全然わからん



168 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 18:17:59.12 ID:H+D/soOr.net]
そろそろ試してみようと思ったらまだそんな感じなの?

169 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 18:38:22.05 ID:rzZFM78t.net]
これから構文の変更は極力減らすらしいし、1.0がリリースされるまでのあと2〜3ヶ月は詰めの時期だろう
ドキュメント周りは絶賛崩壊中。Rust by Exampleとか全然動かん(Issueは立ってるけど)
まあ検索しても古いブログとか引っかかりまくるからな―
なんかあったらGitHub該当レポをいちいち見に行くくらいのことをしないと勉強するのは厳しい

170 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 18:40:22.92 ID:CWvWtJ6X.net]
構文の変更はなくてもAPIの変更はあったりするんだろうか

171 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 19:02:31.26 ID:P4fG3Fn9.net]
このスレ立ったときから安定したら使ってみようと思ってたけど
もう少しらしいね

172 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 19:41:57.99 ID:Om8PoyqQ.net]
ベータのリリースサイクルでライブラリの安定化やるから、
APIはまだまだ変更されるはず

173 名前:デフォルトの名無しさん mailto:sage [2015/01/17(土) 20:40:08.53 ID:H+D/soOr.net]
ベータ出てからも長そうだな...

174 名前:デフォルトの名無しさん mailto:sage [2015/01/19(月) 03:43:45.49 ID:b8H1tohZ.net]
1. 全ての値、変数はそれが定義されたスコープ内で死ぬ(読み書きできなくなる)
2. ある値を殺さずスコープの外に出すには、死ぬ前に外の変数に入れるしかない
3. ただし、参照を外に出すことはできない

lifetimeの原則ってこんなもんだよね?これはまだ分かるけど、ownershipはも少し理解が必要。
マルチスレッドを学ぶときにきっと理解できると信じてる。

175 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 02:47:53.78 ID:CAQhwwqz.net]
fnで定義される関数とクロージャって区別されてるのか。fnで定義できる関数は環境を持たないクロージャとして扱うことができるけど、逆は無理なのな。
fn map<S,T> (x:Vec<S>, f:fn(S) -> T) -> Vec<T> { ... }
っていう高階関数はfnで定義される関数しか受け付けないが、
fn map<S,T,F:Fn(&S) -> T> (x:Vec<S>, f:F) -> Vec<T> { ... }
は関数もクロージャも通す。

クロージャの定義を見ればコンパイル時に環境を持たないで済むか分かると思うんだけどなあ
関数 ∈ クロージャみたいな関係なんだから、関数で済むなら関数にして欲しい

176 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 07:57:01.37 ID:WTvBD7gs.net]
unboxed closureならほぼ関数みたいに使えると思うけど。やりたいことは、boxingが必要なケース?

177 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 08:02:49.45 ID:WTvBD7gs.net]
よくわからん事を言ってしまった。
そもそも、クロージャとして扱うってどういう意味で言っている?
rustではクロージャ「型」というものは最近なくなってしまって、
ただFnを実装した型が関数のように呼び出すことが出来るだけという認識。
Fnを実装したある型が関数として定義されているか、
クロージャの構文を使って定義されているかは、
渡される側からは意識する必要がない。



178 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 14:02:52.06 ID:CAQhwwqz.net]
>>177
クロージャとして扱うってのは>>175の二番目のmap<S,T,F:Fn(&S)->T>っていう高階関数は、
fn foo(...)で定義された関数を渡すことができるし、let baz = |&:| { ... }とかやって定義したクロージャを渡すこともできる。
>>175の一番目のmap<S,T>はfnで定義した関数は渡せるけど|&:| {...}は渡せない。
つまり、関数とクロージャは別物なんだけど、クロージャを受け取る高階関数は関数も受け取れる。
それを指して「クロージャを受け取れる高階関数は、普通の関数もクロージャとして扱う」っていう意味で言った。

referenceのfunction typeの項
doc.rust-lang.org/reference.html#function-types
にもあるとおり、関数の型はfn(args) -> retと書けるもので、traitの実装とかではない。
一方でクロージャはFnトレイトの実装。違いは環境を持つか否か。

179 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 18:02:24.49 ID:5OYX7sX+.net]
>>178
おそらくだけど、Rustの言語仕様で閉じる範囲に関しては、すべて区別せず Fn traitに統一したい意図があると思う。
関数型が残されているのはFFIの都合かと

180 名前:デフォルトの名無しさん mailto:sage [2015/01/20(火) 20:43:45.16 ID:CAQhwwqz.net]
そうなの?関数内で関数を定義できるからある程度は使えるんだけどな。

ついでに質問なんだけど、Fn traitの記法Fn(s) -> tってのはこれ専用の記法なの?
それとも一般的な記法の一例?

181 名前:デフォルトの名無しさん mailto:sage [2015/01/21(水) 01:12:38.06 ID:YXeDnvLj.net]
Fn みたいな () -> を使う記法はいまのところFnとFnMutとFnOnce専用だったはず。
他にこの記法使えるとうれしい場面があるならば提案すれば使えるようになるかも。

そもそもこの記法採用されたきっかけというのが、
Fn(A. B) -> C を desugar した形式の Fn<(A, B), C> が書きにくいというのもあるけど、
Fn のdesugarした形式自体がまだfixできていないから、
ひとまずsugarだけ使えるようにして実体の表記は使えなくしようというものだったはず。

実際、Fnの戻り値型はAssociated typeで与えるようにしようとか、
Foo()-> Aの記法は Foo<Output=A> の意味にしようとか、いろいろ議論があるらしい。

当面は、RFCウォッチすると議論が追えると思う。

182 名前:デフォルトの名無しさん [2015/01/21(水) 09:15:31.70 ID:mE4mMlsp.net]
トップレベルで型注釈を強制するのはひとつの見識だとは思うんだが、
型の表記がもう少しスッキリしたマトモなものじゃないと面倒臭すぎる。
なんでそういうところはMLやHaskellを見習わなかったのか……

183 名前:デフォルトの名無しさん mailto:sage [2015/01/21(水) 11:29:22.51 ID:4FCeMM5/.net]
>>182
本当だねえ。関数引数リストの中がゴミゴミしい

184 名前:デフォルトの名無しさん mailto:sage [2015/01/22(木) 01:22:08.93 ID:KmZyTX6h.net]
ttps://github.com/rust-lang/rust/issues/20797?#issuecomment-69947098
associated typesを使っているtraitが拡張できん…

185 名前:デフォルトの名無しさん mailto:sage [2015/01/25(日) 05:05:02.45 ID:47J/10kQ.net]
>>184の問題の再現コードは、
trait DeclaredTrait {
type Type;
}
impl DeclaredTrait for i32 {
type Type = i32;
}
struct Struct<B: DeclaredTrait> {
b: B,
b1: B::Type,
}
とあり、 Struct { b: 0, b1: 0}などとするとICEになるが、色々試した結果、Structを少し弄って
struct Struct<T, B: DeclaredTrait<Type=T>> { ...
とすれば回避できることが分かった。やったと小躍りしていたらfixされた。Oh...

186 名前:デフォルトの名無しさん mailto:sage [2015/01/29(木) 19:53:46.66 ID:zNgdEinm.net]
arthurtw.github.io/2014/11/30/rust-borrow-lifetimes.html
borrowingについてはbookより良い説明になってる。

stackoverflow.com/questions/22188088/what-does-a-scoped-lifetime-in-rust-actually-mean
この解答はかなりlifetimeについて分かりやすかった。

lifetimeとsubtypingの類似性をまとめようと思ったが力尽きた。
1つの事柄を説明しようとすると別の関連項目も入れた方がいいなとかやってると膨大になる。

187 名前:デフォルトの名無しさん mailto:sage [2015/02/04(水) 22:01:24.98 ID:TC60WqWu.net]
rustはじめました
バカなんですけど教えてください
fn main() {
let mut a = &1is;
let mut b = &2is;
a = b;
}
b = a だと平気なのに a = b だと叱られます。なぜですか



188 名前:デフォルトの名無しさん mailto:sage [2015/02/05(木) 01:26:26.56 ID:dGetvNcg.net]
先に宣言した方がlifetimeが長くなるルールだから?

189 名前:デフォルトの名無しさん mailto:sage [2015/02/05(木) 01:47:21.88 ID:u4P5BLYw.net]
nightlyなら通るよ>>187

190 名前:デフォルトの名無しさん mailto:sage [2015/02/05(木) 20:57:01.65 ID:xsa081YG.net]
お二方どうも

>>188
どこで寿命尽きるのかlifetimeムズカシイです

>>189
通るのですか
しかしエラー出ます rustc 1.0.0-nightly (eaf4c5c78 2015-02-02 15:04:54 +0000)
githubのをビルドしないとダメでしょうか
面倒なのでブック読みながらバイナリの更新待ちます

191 名前:デフォルトの名無しさん mailto:sage [2015/02/06(金) 00:07:57.08 ID:ZZvCiYpX.net]
今なら2015-02-04のバイナリ落ちてくるよ

192 名前:デフォルトの名無しさん mailto:sage [2015/02/06(金) 01:45:16.44 ID:f5aiPF8n.net]
うーん。変わらずエラーが出ます rustc 1.0.0-nightly (ba2f13ef0 2015-02-04 20:03:55 +0000)
本来>187はコンパイル通るものですか

193 名前:192 mailto:sage [2015/02/06(金) 01:49:34.64 ID:f5aiPF8n.net]
エラーこんな感じで
src/main.rs:3:14: 3:17 error: borrowed value does not live long enough
src/main.rs:3 let mut b = &2is;
                 ^~~
src/main.rs:2:17: 5:2 note: reference must be valid for the block suffix following statement 0 at 2:16...
src/main.rs:2 let mut a = &1is;
src/main.rs:3 let mut b = &2is;
src/main.rs:4 a = b;
src/main.rs:5 }
src/main.rs:3:17: 5:2 note: ...but borrowed value is only valid for the block suffix following statement 1 at 3:16
src/main.rs:3 let mut b = &2is;
src/main.rs:4 a = b;
src/main.rs:5 }

194 名前:デフォルトの名無しさん mailto:sage [2015/02/06(金) 02:10:23.34 ID:9alBoo2L.net]
playpenでも転けるし駄目っぽい

195 名前:デフォルトの名無しさん mailto:sage [2015/02/06(金) 17:39:55.66 ID:uj3RHvbm.net]
nightlyで通ると言ってた者だが、1月24日のは通ったが、今日2月6日では通らなくなってた。

196 名前:デフォルトの名無しさん mailto:sage [2015/02/06(金) 23:25:09.25 ID:gZSM6axtP]
やっぱりlifetimeの長い短いとちゃうかなぁ。
>let mut a = &1is;
>let mut b = &2is;
aの型は&'i isize
bの型は&'j isize
だとするとlifetimeの長さはi > jであるからaはlifetime i以上のisizeへの参照を要求する。
bのlifetimeはjであるからnot live long enoughなんじゃないかなぁ。

197 名前:デフォルトの名無しさん mailto:sage [2015/02/06(金) 23:36:12.02 ID:gZSM6axtP]
うーん、でも
fn print_type_of<T>(_: &T) -> () {
    let type_name =
        unsafe {
            (*std::intrinsics::get_tydesc::<T>()).name
        };
    println!("{}", type_name);
}

fn main() {
    let mut a = &1is;
    let mut b = &2is;
    print_type_of(&a);
    print_type_of(&b);
}
の出力は
&'static isize
&'static isize
やなぁ。



198 名前:デフォルトの名無しさん mailto:sage [2015/02/07(土) 01:46:20.54 ID:Gp97gMW3.net]
やっぱりlifetimeの長い短いとちゃうかなぁ。
>let mut a = &amp;1is;
>let mut b = &amp;2is;
aの型は&amp;'i isize
bの型は&amp;'j isize
だとするとlifetimeの長さはi > jであるからaはlifetime i以上のisizeへの参照を要求する。
bのlifetimeはjであるからnot live long enoughなんじゃないかなぁ。

199 名前:デフォルトの名無しさん mailto:sage [2015/02/07(土) 01:46:51.82 ID:Gp97gMW3.net]
うーん、でも
fn print_type_of<T>(_: &T) -> () {
let type_name =
unsafe {
(*std::intrinsics::get_tydesc::<T>()).name
};
println!("{}", type_name);
}

fn main() {
let mut a = &1is;
let mut b = &2is;
print_type_of(&a);
print_type_of(&b);
}
の出力は
&'static isize
&'static isize
やなぁ。

200 名前:デフォルトの名無しさん mailto:sage [2015/02/07(土) 08:13:43.05 ID:iwrmCGgo.net]
print_type_of ってデバッグでしょっちゅう使うから、標準ライブラリに入ってると良いのに

201 名前:デフォルトの名無しさん mailto:sage [2015/02/07(土) 11:09:20.93 ID:cThHTNUW.net]
get_tydescでlifetimeってstatic以外も出せるの?

fn main() {
let x = &1;
print_type_of(&x); // &'static i32
{
let k = &3;
print_type_of(&k); // &'static i32
}
}

202 名前:デフォルトの名無しさん mailto:sage [2015/02/07(土) 13:33:02.38 ID:cThHTNUW.net]
https://github.com/rust-lang/rust/pull/21657
https://github.com/rust-lang/rust/pull/21022
何言ってるか分からん。誰か解説してください。

203 名前:デフォルトの名無しさん [2015/02/21(土) 07:04:27.61 ID:Olg1CcTP.net]
1.0.0 あるふぁ2 来た

We’ve managed to land almost all of the features previously expected for this cycle.
The big headline here is that all major API revisions are finished: path and IO reform have landed.
At this point, all modules shipping for 1.0 are in what we expect to be their final form, modulo minor tweaks during the alpha2 cycle. See the previous post for more details.

blog.rust-lang.org/2015/02/20/Rust-1.0-alpha2.html

ってことは主な標準ライブラリのAPIも安定するってことか?
安定バージョン出たら使おうと思ってたからそろそろ本格的に勉強しよう

204 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 07:08:43.49 ID:Olg1CcTP.net]
rust 日本で人気ないのなんでだろ
hackernews とかでは話題になるのに

205 名前:デフォルトの名無しさん [2015/02/21(土) 07:54:16.64 ID:r4ISt4ZW.net]
なってねーよ
Rustユーザーの声がでかいだけ
Githubのトレンド見ろよ
てかいつ1.0になるんだよ
コンパイルクソ遅せーよ

206 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 08:28:43.29 ID:R5TBrCid.net]
今見たらハッカーニュースで話題になっててワロタ

207 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 11:27:04.19 ID:Fus77TES.net]
日本人なんでいつも出遅れじゃん

半島人や大陸人ではないので念のためw



208 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 11:37:56.64 ID:Fus77TES.net]
RELEASES.md
Version 1.0.0-alpha.2 (February 2015)
ttps://github.com/rust-lang/rust/blob/master/RELEASES.md#version-100-alpha2-february-2015

本題と離れたこの辺が好き→Rust is tested against a LALR grammar

209 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 18:56:18.12 ID:NoRQyCne.net]
日本はシステム寄り言語はあまり盛り上がらない印象
フレームワークでこんなんできた、とかそういうのばっか

210 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 19:05:24.66 ID:XLU71/kI.net]
そのフレームワークにも乗り遅れてるけどな

211 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 20:18:51.42 ID:4tV2h1eL.net]
今のペースだと1.0は早くても5月の半ば
GWあたりから勉強すればいいや

212 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 22:16:25.60 ID:u58zLpzB.net]
ttps://github.com/uutils/coreutils
Cross-platform Rust rewrite of the GNU coreutils

面白そうだから時々覗いてるけど、作る宣言してやりかけか音沙汰なしが多い

213 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 22:19:24.18 ID:SweHsfSk.net]
1.0が出てからが本番

214 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 22:47:20.72 ID:24QmOmn3.net]
最近Nimとの比較記事よく見る
試したことないが速いんか

215 名前:デフォルトの名無しさん [2015/02/22(日) 05:47:39.50 ID:XKjiDtco.net]
試せよ
馬鹿なの?

216 名前:デフォルトの名無しさん mailto:sage [2015/02/22(日) 08:13:00.52 ID:NjIsBkYB.net]
やだね

217 名前:デフォルトの名無しさん mailto:sage [2015/02/22(日) 10:43:53.32 ID:x4NvaSP0.net]
"「Unix in Rust」の作者がRustを捨ててNimに移行"
ttp://developers.slashdot.jp/story/15/02/20/2132207/

Nimの詳しいところは見てないけど、ソースぱっと見で括弧や大文字小文字のめりはり無くて散り散りした感じは嫌だな
その点はこっちの方がいい



218 名前:デフォルトの名無しさん mailto:sage [2015/02/22(日) 20:28:37.40 ID:0ELzUNxg.net]
NimはRustよりかなり前からあったでしょ。少なくともぽっと出の新人じゃない。

Nimは高速化、拡張の手段が多い(テンプレート&マクロ, コンパイル時計算, 最適化処理)にもかかわらず、
それらを作るときに変態的な見慣れぬ処理をしているようには見えない。
この、LispのマクロがPythonの文法でやれているのがおそらく一番凄いところ。
Python人口は多いから間口は広いと思うよ。Pythonと違ってまともなスコープだし。

型システムはRustの方が見通しが立っている。Nimはちょっと独特。
そして何より、Rustは低レベルもターゲットだけど、Nimはそうじゃない。
高速 -> 低レベルってのは昨今じゃ成り立ってない。

219 名前:デフォルトの名無しさん mailto:sage [2015/02/22(日) 20:59:13.82 ID:LRANqcPT.net]
あっちはGC、こっちは全手動

220 名前:デフォルトの名無しさん mailto:sage [2015/02/22(日) 22:12:46.57 ID:7JvXqGjL.net]
>>219
全手動って、ほぼRAIIとレファレンスカウンタで足りてるように思うけど。
別にmalloc,freeを一々手で書いてるわけではない。

221 名前:デフォルトの名無しさん mailto:sage [2015/02/23(月) 00:57:37.90 ID:AFp5DLmZ.net]
NimのGCがスレッドセーフになるのと、RustにGCが搭載されるのと、どっちが先か

222 名前:デフォルトの名無しさん mailto:sage [2015/02/23(月) 08:07:08.31 ID:5h1ypUSf.net]
RustはGC搭載だったのを取り除いたんじゃなかったか

223 名前:デフォルトの名無しさん mailto:sage [2015/02/23(月) 19:40:30.09 ID:eyhGdPbs.net]
RustでもDでもNimでもなんでもいいよ
俺は勝ち馬に乗りたいだけだ
共倒れになるのが一番困るんだよ

224 名前:デフォルトの名無しさん mailto:sage [2015/02/23(月) 21:48:25.71 ID:hrwL6DMU.net]
勝ち馬おじさんは適当なほにゃららbindingsでも作ってオポを得てください

225 名前:デフォルトの名無しさん mailto:sage [2015/02/24(火) 00:16:34.89 ID:Xk/EueOy.net]
>>222
RustのあれはGCじゃなくて今で言うところのRcだったはず
GCの一種といえば一種だけど、実装は異なるから区別したい

226 名前:デフォルトの名無しさん mailto:sage [2015/02/24(火) 02:31:58.07 ID:F5ABen3P.net]
参照カウンタもオブジェクトマップも両方GCで最近の参照カウンタは実行時じゃなくてコンパイル時にやるGCじゃないやつがあるんだよ。

227 名前:デフォルトの名無しさん mailto:sage [2015/02/27(金) 03:23:46.29 ID:SOolYU16.net]
Boxはownership付きのポインタだ!と気付き、ヒープに限定しなくてもいいんじゃないかと思ったんだが、
move semanticsがあるので、そんなに便利にはならないことが分かった。
うまくできているなと思う。



228 名前:デフォルトの名無しさん mailto:sage [2015/02/28(土) 17:38:52.88 ID:zVTmyizc.net]
RustでC++のコードを呼び出せるようにならないかな

229 名前:デフォルトの名無しさん mailto:sage [2015/02/28(土) 17:40:37.54 ID:ODdhY4Z/.net]
呼べるんじゃね

230 名前:デフォルトの名無しさん mailto:sage [2015/03/01(日) 14:43:26.72 ID:GK+mth0P.net]
FFIくらいあるじゃろ

231 名前:デフォルトの名無しさん mailto:sage [2015/03/02(月) 19:48:54.98 ID:jKoObBcz.net]
ServoではCのラッパー関数作ってるって書いてあった
ただそれだと関数呼び出し増えた分のオーバーヘッドがあるから、
言語を跨がった最適化を検討中だとか

232 名前:デフォルトの名無しさん mailto:sage [2015/03/02(月) 21:38:37.91 ID:r8lAZceI.net]
rust自身も自分用llvmを使っていて、ビルドに超時間がかかる。
Servoは自分用rustを使っているのでもっと時間がかかるので、面倒でしょうがない。

233 名前:デフォルトの名無しさん mailto:sage [2015/03/02(月) 22:35:12.26 ID:jKoObBcz.net]
同じくrustcのバージョン固定してるcargoはnightlybuildのバイナリ使ってるけど、
servoはソースからコンパイルしてるの?

234 名前:デフォルトの名無しさん mailto:sage [2015/03/12(木) 17:19:15.80 ID:RfbJhqVK.net]
してた。ゴ食わず嫌いだったゴメンよ

235 名前:デフォルトの名無しさん mailto:sage [2015/03/16(月) 00:17:19.80 ID:eDQflfth.net]
rustは配列内包無いん?

236 名前:デフォルトの名無しさん mailto:sage [2015/03/20(金) 18:24:48.01 ID:+SAQAguo.net]
今は動かない&配列じゃなくてイテレータを返すやつだが、
https://github.com/bsteinb/rust-iteratorcomprehensions
を自分で修正したらいいんじゃないかな。うまくいったら使い心地とか教えてほしい

ところで、マクロに名前空間とか欲しくない?vec!じゃなくてVec::new!みたいにできたら、
長い名前を付けないでも衝突の心配が無くなっていいと思うんだけど

237 名前:デフォルトの名無しさん mailto:sage [2015/04/01(水) 20:39:05.61 ID:cmpu1vG2.net]
ちょっと見ないでいると新しい構文ができてたり、前の構文が禁止になったりと変遷がまだ激しい
関数定義にも型推論が効くようになったらありがたいんだけど、lifetimeパラメータがあるから当分は無理だろうな



238 名前:デフォルトの名無しさん [2015/04/04(土) 10:44:07.36 ID:3u9gfu59.net]
ttp://blog.rust-lang.org/2015/04/03/Rust-1.0-beta.html
ベータきた

239 名前:デフォルトの名無しさん mailto:sage [2015/04/04(土) 17:25:52.34 ID:tHhrzAt2.net]
これで他所様のcrateがコンパイルできないって事態が減るのか。ありがたや。

240 名前:デフォルトの名無しさん mailto:sage [2015/04/06(月) 02:32:19.13 ID:h+YQESxX.net]
std::fsのPathExt使いたいんだけどどうすりゃいいの?
#![feature(PathExt)]追加してけど今度はこれに対して文句言われるし

241 名前:デフォルトの名無しさん mailto:sage [2015/04/06(月) 07:54:14.20 ID:TRGNibS3.net]
>>240
使ってるrustはbetaとnightlyのどっち?
unstableな機能はbetaじゃ使えないから、nightlyを使う必要がある

242 名前:デフォルトの名無しさん mailto:sage [2015/04/06(月) 09:14:39.34 ID:SQyZe7Rp.net]
>>240
#![feature(path_ext)]としたら動かない?あと1.0.0-betaじゃなくてnightly buildだったらunstableがエラーにならない、はず。

243 名前:デフォルトの名無しさん mailto:sage [2015/04/07(火) 17:58:26.92 ID:sYJ921on.net]
nightly buildにして#![feature(path_ext)]にしたら動きました

244 名前:デフォルトの名無しさん [2015/04/19(日) 19:52:26.06 ID:KK4Vp0dw.net]
rust-lang.orgのトップにあるコード、あれでRustに魅力を感じることはないよね……

245 名前:デフォルトの名無しさん mailto:sage [2015/04/19(日) 22:55:50.22 ID:Pae6mGZb.net]
どんなコードなら魅力を感じる?

246 名前:デフォルトの名無しさん mailto:sage [2015/04/20(月) 20:41:29.82 ID:SBrGan7W.net]
パターンマッチはRustくらい低レベルな分野では珍しいから悪くはない。
だけど色くらい付けた方がいいのは確か。

247 名前:デフォルトの名無しさん [2015/04/21(火) 12:34:26.69 ID:DovQc0Av.net]
その程度の輩を入口でフィルタアウトできてちょうどいい



248 名前:デフォルトの名無しさん mailto:sage [2015/04/21(火) 20:58:23.87 ID:8SfamI7q.net]
完成度高いけど読みづらい
色々詰め込みましたって感じであまりセンスを感じないかな

249 名前:デフォルトの名無しさん mailto:sage [2015/04/21(火) 21:13:43.96 ID:t5rHangx.net]
syntaxにケチつけてセンスとか言ってるのも片腹ポンポンペイン感がある
見た目はC言語ユーザーに合わせてsemanticsは全然違ようにしてあるのに

250 名前:デフォルトの名無しさん mailto:sage [2015/04/21(火) 22:17:14.88 ID:p6Hmsc0c.net]
構文のC言語風な部分に文句を言ってる訳じゃなさそうだが……

251 名前:デフォルトの名無しさん [2015/04/21(火) 22:35:19.48 ID:wBLqiLA1.net]
実際、読みづらいし書きづらいだろ。
関数型の感覚で書こうとするといたるところで引っかかる。

直和型に対するenumっていう命名のセンスも
シンタクスの話だが、無視できない筋の悪さを感じる。

252 名前:デフォルトの名無しさん mailto:sage [2015/04/22(水) 00:19:44.26 ID:G0rTsYMJ.net]
Mozilla自体、将来性怪しい

253 名前:デフォルトの名無しさん mailto:sage [2015/04/22(水) 01:52:28.56 ID:8x+/Tpq3.net]
GNUもそうだけどだいたいのユーザーは結局利便性>>>思想だから
その思想に属するソフトが最も良い時はその理念を支持してくれるけど
そうじゃなくなったら...ねえ

254 名前:デフォルトの名無しさん mailto:sage [2015/04/22(水) 03:13:38.70 ID:Itj79n5U.net]
泥臭いレベルで考えれば直和型はenumでいいと思う。
以前は、例えばOption型のand_thenとかor_elseがクロージャを取らなかったから繋げるのが面倒だったけど、
今はそうでもないよ。

ただ、プロトタイピングとか手探りでモックアップ的なものを書きながら試すのは相変わらずしんどい。
慣れたら型エラーlifetimeエラー出さずにガリガリ書けるのかもしれんが、「誰が資源の所有者であるか」を意識し続けるのはまだ難しい

255 名前:デフォルトの名無しさん mailto:sage [2015/04/23(木) 23:36:44.51 ID:wT/D2HMU.net]
javaのenumも定数クラスをフィールドと見なせば直和型だがセンス悪いですか・・・。
定義もEnum<E extends Enum<E>>だし
クラス使ったオブジェクト指向っぽくやるとそうなるんじゃないかな。

256 名前:デフォルトの名無しさん [2015/04/24(金) 12:44:05.34 ID:/IU9j/kd.net]
enumは直和型の特殊事例として表現できるが、
逆に直和型をenumの拡張とみなしているうちは面白い使い方はできないだろ。

257 名前:デフォルトの名無しさん mailto:sage [2015/04/24(金) 22:34:58.83 ID:w/TzYGT8.net]
特殊事例じゃなくて表現方法の1つじゃないの?
例えばhaskellの直和型で可能でenumじゃ無理なことって何がある?
面白い使い方って色々とサポートが必要でしょ?特にメモリ周りで。
例えばリストだったらenum List<T> { Nil, Cons(T, Box<List<T>>)}って面倒だったり、
コンストラクタを関数として扱おうとするなら部分評価時のクロージャを誰が保持するのか利用者が注意しなくちゃならない。
そういう細々としたことをGCや遅延評価で隠せない、隠さないのがいいところでもあるんだから。

オーバーヘッド無しにもっと便利にできるよ!っていうなら取り入れられるよ多分。
低レベルな分野で型推論とか自動メモリ管理とか入れようとしたらどうなるの?っていう実験やってるようなもんだし。



258 名前:デフォルトの名無しさん [2015/04/25(土) 09:17:20.05 ID:YZfn/g4I.net]
ServoみたいなRustの大きいプロジェクトでは
ファントム型がよく使われてるが、これが普通に定着するといいな。

ただ、型はすぐ濫用されるからなあ。
Rustで型レベルプログラミングとか見たくないわ……

259 名前:デフォルトの名無しさん [2015/04/28(火) 14:45:42.12 ID:TsKA4yAm.net]
Reenix: Implementing a Unix-Like Operating System in Rust
ttps://twitter.com/rustlang/status/592743898692321280

早速OS作ってる人いたか

260 名前:デフォルトの名無しさん mailto:sage [2015/04/28(火) 14:58:13.79 ID:nSrS/3uC.net]
https://github.com/rust-lang/rust-wiki-backup/blob/master/Operating-system-development.md

Rust OS勢は前から結構いるのでどの程度のものなのか謎である

261 名前:デフォルトの名無しさん mailto:sage [2015/04/28(火) 16:10:37.53 ID:TsKA4yAm.net]
ほんとだ、いろいろいるわ
でもちょっとブートしてみた、とか何とかutils作ってみた系が多くて
ガチOS始めた人は少数なのか

262 名前:デフォルトの名無しさん [2015/05/05(火) 13:51:43.12 ID:k0XsKdeW.net]
パーティ行きたいけど遠いな(´・ω・`)
ttp://www.eventbrite.com/e/copenhagen-rust-launch-party-tickets-16663376608
やっと1.0、そろそろ本気出す人多そう

263 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 06:07:02.36 ID:mzucxP2W.net]
日本でもあるよ。枠埋まっちゃったけど
ttp://rust-samurai.connpass.com/event/14649/

264 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 09:17:16.43 ID:JOkpKlyr.net]
自分の使っているディストリはソースからビルドされたrust(1.0.0-beta.3)を使っているため、cargoは入っていない。
で、cargoがnightly(1.1.0系列)に追随している&他のパッケージもnightly追従になっているおかげでcargoのビルドがCargo.tomlを編集しないと通らない。
travis CIに通っているパッケージもnightly準拠。ええい、安定と言うにはまだ色々あるぞ。

265 名前:デフォルトの名無しさん [2015/05/06(水) 10:01:59.45 ID:cmDHtTLB.net]
rust開発チームは何かと前のめりな人が多いのかな

266 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 11:33:10.40 ID:2ABYi4qj.net]
前のめりな人ってどないやねん

267 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 13:55:18.13 ID:xpDcmA5j.net]
いろいろあるけどとりあえず1.0にして酒盛りだw

直す所はまだあるとしても、仕様が固まってくれると学ぶ気になれるのでありがたい、けど



268 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 16:17:50.78 ID:am6Qsc64.net]
cargo使うにはnightly build使えって事?

269 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 22:51:00.49 ID:JOkpKlyr.net]
>>268いや、公式サイトからバイナリ落として使うなら1.0.0-beta.3にcargoが入っているので大丈夫。
自分のLinuxディストリがソースからビルドしたものを提供していたり、自前でrustをビルドしている人は自分でcargoをビルドする必要がある。
で、自分でbeta用のcargoをビルドするのが面倒だねって話。

crate.ioのgetting startedは相変わらずnightlyを推奨しているのは温度差を感じる。
Cargo.tomlにコンパイラのバージョンあるいはstdのバージョンを示すダミーcrateを登録できたらいいのか?

270 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 00:38:18.86 ID:aZRIIXEP.net]
>>264
travisはbetaチャンネルのコンパイラとcargo使うオプションあるよ。
フォーラムにやり方の投稿があったはず

271 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 13:27:05.75 ID:23tsmTPn.net]
>>263
日本人のcontributorって結構いるの?

272 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 17:33:22.03 ID:aZRIIXEP.net]
>>271
GitHubでの開発だからいわゆるcontributorとはずれちゃうんだけど、
PullRequest出してマージされてる日本人は何人か見たことある
今回の主催の人はservoリポジトリへのコミット権持ってて結構活躍している

273 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 18:24:03.66 ID:ADm0d2/c.net]
On Lisp 和訳の人の名前を見た気がする

274 名前:デフォルトの名無しさん mailto:sage [2015/05/11(月) 03:01:17.51 ID:bJJob3eC.net]
BetaのドキュメントにComing Soonが多いんだが、Nightly見た方が良いの?

275 名前:デフォルトの名無しさん [2015/05/12(火) 01:10:22.42 ID:xKmS5U3V.net]
どうせ動かないんでしょ

276 名前:デフォルトの名無しさん mailto:sage [2015/05/14(木) 00:16:14.10 ID:K0fBW8ZW.net]
'The Rust Programming Language' as EBook
ttps://github.com/killercup/trpl-ebook

277 名前:デフォルトの名無しさん mailto:sage [2015/05/14(木) 06:37:57.45 ID:HvPUnCOb.net]
>>263
元日立社員が転職して後悔してさらに転職を計画
yomogi.2ch.net/test/read.cgi/net/1429876526/



278 名前:デフォルトの名無しさん mailto:sage [2015/05/16(土) 00:11:55.14 ID:3gBP+Qn+.net]
Programming Rust Paperback – November 25, 2015
ttp://www.amazon.com/Programming-Rust-Jim-Blandy/dp/1491927283/
ISBN-13: 978-1491927281
ISBN-10: 1491927283

279 名前:デフォルトの名無しさん [2015/05/16(土) 02:23:52.03 ID:3gBP+Qn+.net]
Announcing Rust 1.0
ttp://blog.rust-lang.org/2015/05/15/Rust-1.0.html

Today we are very proud to announce the 1.0 release of Rust, ...

280 名前:デフォルトの名無しさん mailto:sage [2015/05/16(土) 02:43:58.46 ID:7PFiMYNq.net]
正真正銘バージョン1.0リリース! おめでとう。

281 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 01:33:56.23 ID:sVRosqPI.net]
sage

282 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 13:05:27.84 ID:I8sSWQip.net]
let mut って…
気持ちは分かるが厳密過ぎだろ…

283 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 14:22:47.25 ID:N0SAwEsK.net]
普通だと思うけど... 今までCしか使ったことないのか。

284 名前:デフォルトの名無しさん [2015/05/18(月) 14:33:14.59 ID:J+DllwNy.net]
>>282
それならそもそもmutableな変数が無い方がいい、とな。
なるほど賛成だ。

285 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 15:22:04.80 ID:I8sSWQip.net]
>>283
普通は
const immutable = 0; または let immut immutable = 0;
let mutable = 0;
だろ
なぜ良く使う変数の方がタイプ数が多いんだよ…

286 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 15:44:06.55 ID:N0SAwEsK.net]
>>285
mutableな変数の出番が多いのはあなたの書き方の癖であって、他の全員に当てはまるわけでは無いと思う。
特にRustはifやmatch等が値を返すからmutableと相性が良いと思うけど。

287 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 15:45:07.29 ID:N0SAwEsK.net]
>>286
修正: immutableと相性が良い



288 名前:デフォルトの名無しさん [2015/05/18(月) 16:26:46.46 ID:J+DllwNy.net]
>>285
>なぜ良く使う変数の方がタイプ数が多いんだよ…

immutableな変数の方をよく使わないのだとしたら、
そもそもRustでのプログラミングには向いてないな。
基本的には破壊的更新をしない関数型スタイルで書かせて、
それをコンパイラが巧く処理してゼロコストにする、
というのがRustの設計思想なんで。

いい機会だから、変数の再代入を一切使わずにコード書いてみるといい。

289 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 17:11:40.54 ID:hULj5jYE.net]
つまりC++でconst書きまくるのに疲れてる俺向きということですな!

290 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 22:19:14.44 ID:eEjXu/P7.net]
関数型言語を触ってみるとリフレッシュできるよ。OCamlが緩くてお勧め。
RustはセルフコンパイルできるまでOCamlで開発されてた位にはメジャーで実用的。
パターンマッチや型推論、その他色々なRustの機能は関数型言語由来のものがあるから触ってみて損は無い。

「低レベルな領域に関数型言語の便利なエッセンスを(ゼロコストで)どれだけ入れられるか、入れたらどれだけ楽になるか」
みたいな発送がRustから感じられる。
もっとMLライクな文法でも良かったと思うけどね。

291 名前:デフォルトの名無しさん [2015/05/18(月) 23:34:48.44 ID:J+DllwNy.net]
>>290
>もっとMLライクな文法でも良かったと思うけどね。

せめて型宣言はムリにC系のものにして関数定義の頭に押し込めずに
別立てにしたほうが良かったと思うんだよなあ。

とはいえ、確かにML系つうかOCamlの匂いは強くするよね。

292 名前:デフォルトの名無しさん mailto:sage [2015/05/19(火) 15:09:00.81 ID:UYmTOlX3.net]
>>285
まあそのまま仕様を受け取って、immutな方を自然に使って欲しいんだろう。
命令型言語に関数型の風味を取り込んでみたってことで。

ocamlの方は逆な風味だが命令型取り込んだ無理やり感がする。
rustも一実験言語で終わるのか、伸びるのか

293 名前:デフォルトの名無しさん mailto:sage [2015/05/19(火) 21:19:02.97 ID:AGcxeKzS.net]
前はマニアのための実験的言語って書いてあったのに今では1.0だなんて感動する

294 名前:デフォルトの名無しさん [2015/05/21(木) 00:03:14.73 ID:R841WaTJ.net]
今更セミコロンがある謎言語

295 名前:デフォルトの名無しさん mailto:sage [2015/05/21(木) 02:10:17.69 ID:gi6AaWSD.net]
val foo : i32 -> i32とかできると便利よな。前方宣言は一応できるけどCスタイルだから冗長だし、
定義時に同じこと書かないといけないから面倒。

まあ、ML寄りの文法で変数の宣言とか並べるのも汚いかもしれんし、
関数型に近寄るとその分デバッグが難しくなる。誰かがML系rustを作ったら今の文法の良さが見えてくるかもね。

296 名前:デフォルトの名無しさん mailto:sage [2015/05/21(木) 11:04:47.93 ID:HQdruXcL.net]
正式版でたんで久々に入れてみたら
単純計算ものでも2倍くらい速くなってるな
node.jsと同じくらいにはなった

297 名前:デフォルトの名無しさん mailto:sage [2015/05/29(金) 01:21:31.51 ID:CYHwmvYd.net]
The evolution of Rust
lambda-the-ultimate.org/node/5169



298 名前:デフォルトの名無しさん mailto:sage [2015/05/30(土) 07:05:58.43 ID:AYzItcLB.net]
>>296
単純計算だけならC++と同じぐらいだろ
所詮LLVMのフロントエンドなんだし

299 名前:デフォルトの名無しさん mailto:sage [2015/05/30(土) 10:56:09.40 ID:qPmgq1NQ.net]
言語はけっこう好みだけど仕事はC++だし
趣味用にはもうひと押し欲しい気がする

300 名前:デフォルトの名無しさん mailto:sage [2015/05/31(日) 07:07:23.95 ID:QzJY7rQQ.net]
Rust って let (a,b) = (1,2); は出来ても、
 let a = 1, b = 2;
は出来ないのか。

何故? 別に何かの文法と衝突でもするのか?

301 名前:デフォルトの名無しさん mailto:sage [2015/05/31(日) 09:03:35.54 ID:chRy4RzH.net]
>>300
let mut a =1, b=2;
としたときにbがmutableになるのかならないのか曖昧に見えるから、という理由だった記憶がある
とにかく、なにかしら理由があったはずだよ

302 名前:デフォルトの名無しさん mailto:sage [2015/05/31(日) 09:58:57.84 ID:QzJY7rQQ.net]
なるほど。でも、なら let mut を var にして欲しいな。
mutable 変数は var で宣言する方が好みだ。

でググったら当然過去に let mut <-> var 議論あった。
ざっと読んだら、Rust の精神には immutable が根本にあって、
mut は気安く使うんじゃねーよ、的な障壁としての let mut みたいだ。

確かに var だと気安く使っちゃうからね。ってこれスレのすぐ上で話題になってた話だな……

303 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 07:46:19.89 ID:JhAQPJZl.net]
mutable参照を共有できないって厳しすぎないか?
警告ならわかるがエラーは勘弁してほしい

304 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 09:39:17.92 ID:tuFYxFU/.net]
Rc<RefCell<T>>やArc<Mutex<T>>をどうぞ

305 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 18:40:49.25 ID:JhAQPJZl.net]
>>304
なるほどRefCellを使えばある程度は解決しそう
ちょっと強引かもしれないけどこんな使い方も出来た

// これはエラー(配列やスライスは同時に1つの要素しかmutable参照が作れない)
let mut array = [ 0, 1 ];
std::mem::swap(&mut array[0], &mut array[1]);

// これならOK
let array = [ std::cell::RefCell::new(0), std::cell::RefCell::new(1) ];
std::mem::swap(&mut *array[0].borrow_mut(), &mut *array[1].borrow_mut());

306 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 19:42:13.90 ID:rjZb8+Jq.net]
記述めんどいやろmut使うなという強烈なメッセージを感じるw

307 名前:デフォルトの名無しさん mailto:sage [2015/06/13(土) 11:23:17.39 ID:/rtQk4xD.net]
>>305
試してないけど
let array = Rc::new(RefCell::new([0, 1]));
じゃだめかな?こっちのほうがまだましかなと思うんだけど



308 名前:デフォルトの名無しさん mailto:sage [2015/06/13(土) 22:39:23.60 ID:kJh3Un39.net]
>>307
RefCellを使えば所有権を動的に貸し借りできるようになるってだけで
mutable参照は同時に1つまでというルールは変わってない(2つめを取得しようとしたらpanic)
>>305は配列の要素の所有権を取ると配列全体の所有権まで取ってしまうのが
要素毎にRefCellを使えば要素毎に所有権を取れるという話
それとRcは寿命を動的管理するためのものであって所有権とは無関係

ちなみにstd::mem::swapは引数が&mutだけどstd::ptr::swapなら*mutだから所有権を取らない
結局unsafe使うのがベスト
let mut array = [0, 1];
unsafe { std::ptr::swap(&mut array[0], &mut array[1]); }

309 名前:デフォルトの名無しさん mailto:sage [2015/06/19(金) 11:24:27.05 ID:7YWFihrY.net]
WebAssembly対応すればブラウザゲーをRustで作れるようになるんかな

310 名前:デフォルトの名無しさん mailto:sage [2015/06/26(金) 05:16:57.34 ID:MTQE4YuR.net]
borrow checkerや型チェックで弾かれるのはまだいいんだけど、unsized typeで怒られるのが面倒。
AsRefとかDeRefとか、traitを多用し過ぎじゃないのか。traitに関する構文(多相型関数の定義とか)も冗長に思ってしまう。

311 名前:デフォルトの名無しさん mailto:sage [2015/06/26(金) 22:05:32.88 ID:4tQavpY6.net]
久しぶりに見たら1.1になってた
https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-110-june-2015

312 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 01:28:47.33 ID:F+n2jvy1.net]
rebuld.fm聞いて、rust触ってみたくて来ました。
今から手を出す場合、どこを見るところから始めればいいです?

313 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 02:07:48.13 ID:fUkToYrK.net]
>>312
Rust by Exampleとか?
rustbyexample.com

314 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 05:34:06.57 ID:F+n2jvy1.net]
>>313

おお、良さ気です。ありがとうございす。

https://www.youtube.com/watch?v=i17doLVXlYU
をみてたら、すごく、関数型言語ぽくていいっすね〜
俄然やる気でます。

315 名前:デフォルトの名無しさん [2015/06/27(土) 10:51:13.60 ID:nreZwDj/.net]
実際に書いてみると全然関数型言語っぽくないのだよなあ。
あと、なんかイディオマティクな標準的コーディングスタイルが
確立されないと辛いと思う。

316 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 15:58:00.61 ID:rIdxbF5x.net]
C++テンプレート以来のコンパイラに怒られまくる言語だ

317 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 16:26:20.28 ID:wfeMnVHy.net]
https://github.com/rust-lang/rust/issues/25899
これがなぜだか分からん。

fn main() {
 let a: &mut i32 = &mut 0;
 { let b = a; }
 let c = a;
}
上が駄目で、下がおkな理由。

fn main() {
 let a: &mut i32 = &mut 0;
 { let b: &mut i32 = a; }
 let c = a;
}



318 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 17:22:32.78 ID:99+F8Q1T.net]
>>317
下の例はこれと同じになるらしい
fn main() {
 let a: &mut i32 = &mut 0;
 { let b = &mut *a; }
 let c = a;
}
Rustには型推論と暗黙の変換があるせいで分かりづらいね

319 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 17:34:52.26 ID:wfeMnVHy.net]
上では move されるのに、下では borrow されるのか。

#![feature(core_intrinsics)]

fn print_type_of<T>(_: &T) -> () {
let type_name =
unsafe {
std::intrinsics::type_name::<T>()
};
println!("{}", type_name);
}
これを入れて型を表示すると、上でも下でも b の型は同じ
&'static mut i32 なのに、型注釈するだけで挙動が変わるのは違和感あるなあ。

320 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 17:35:27.20 ID:wfeMnVHy.net]
>>318
ありがとう。うーむ悩ましい。

321 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 18:38:39.26 ID:SbfB1Jvt.net]
>>310
unsized typeで起こられるのってどんな場合?

322 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 18:40:12.36 ID:SbfB1Jvt.net]
>>320
既出じゃなさそうならissue立ててみたら?

323 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 20:45:16.24 ID:j6fAeiVj.net]
>>321 いや、超基本的なミスなんだけど、 fn foo(it: Iterator<Item=i32>) { ... } とかすると怒られるの。
traitを引数にするなら、 fn foo<T: Iterator<Item=i32>> (it: T) { ... } みたいにしないといけない。
解決法は知ってるつもりなんだが、Sizedを実装していないからダメよ、と怒られるのは何故なのか未だに理解はしていない。

324 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 23:20:55.81 ID:SbfB1Jvt.net]
>>323
Trait型は実際にはそのTraitを実装した何かしらの型が実体になるんだけど、
関数引数とかローカル変数としてスタック上に配置するためには型自体のサイズがコンパイル時に分かってる必要があるから、
Trait型はポインタを経由するなどしないといけない
T: Traitとかすると、Tで指定された型それぞれに応じて特殊化された関数が生成されるからコンパイル時に型が特定できてサイズもわかるから問題にならない

325 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 03:45:02.95 ID:sui11WPz.net]
やっぱりスタック上に配置が理由なのね。でもそれって人が配慮する必要があるのか?という部分に不満が残る。
コンパイラが自動的に多相型の関数とみなしたら不都合があるのかな。

326 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 10:13:01.42 ID:6byfIPXR.net]
foo: Traitを<T: Trait> fooのシンタックスシュガーとみなすのはありかもしれないけど、
スマートポインタ型なんかを定義する時とか本当にunsizedな型が必要なケースに困ってしまいそうな気がする。
自動で&Traitなどに変換してしまうのは、ヒープへのメモリ確保とか仮想関数呼び出しが必要で
ゼロオーバーヘッドの原則に反してしまうからrustではやらないと思う。

327 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 17:45:54.19 ID:l0DVu4po.net]
?Sizedが必要な場合もあるし面倒だよね



328 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 19:16:48.49 ID:l0DVu4po.net]
トレイトは別のトレイトを継承できるけど
継承しててもトレイトからトレイトにはアップキャスト出来ないっぽい
これじゃあオブジェクト指向のような多態性を活かした設計は難しいね

329 名前:デフォルトの名無しさん [2015/06/29(月) 09:33:30.50 ID:8+Jbzv8W.net]
単なる型クラスになに要求してんのかと。
Rustがオブジェクト指向でないのは結構なことだ。

330 名前:デフォルトの名無しさん mailto:sage [2015/06/29(月) 17:09:32.97 ID:9FsJz544.net]
trait FooExt : Foo { .. } ってのは、単にFooExtを実装する型はFooも実装しなければならない、という意味しかない。

FooトレイトをimplするだけでFooExtトレイトも使えるようにしたい、という目的なら、
impl<F: Foo> FooExt for F { ... } とすると良い。
struct STFoo;
impl Foo for STFoo { ... }
とかすると、STFooはFooExtのメソッドも呼び出せる。

FooとFooExtに同じ名前のメソッドdo_foo(&self)があったときは、呼び出し側でFoo::do_foo(&foo)とかしないといけない。

OOPでアップキャストが必要な場面ってあったっけ?

331 名前:デフォルトの名無しさん mailto:sage [2015/06/30(火) 22:00:52.85 ID:5IIg4rdj.net]
暗黙のアップキャストてOOPの基本の一つじゃね?

332 名前:デフォルトの名無しさん mailto:sage [2015/06/30(火) 22:32:05.66 ID:uCmnNLIn.net]
どの言語のOOPかにもよるのでは。知らんけど。

333 名前:デフォルトの名無しさん mailto:sage [2015/06/30(火) 22:34:50.83 ID:OotDes5f.net]
Rustって強力なトレイトという名の型クラスを導入することでOOP(のRustにとって必要な部分)が(綺麗に)できるというだけで、別にOOPするための言語では無いと思う。

ちなみにアップキャストってこれじゃいかんの?
stackoverflow.com/questions/28632968/why-doesnt-rust-support-trait-object-upcasting

334 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 01:38:30.43 ID:Co4dDuJ+.net]
インターフェースを拡張した場合において、拡張元のインターフェースにアップキャストできるかどうかは、OOPL次第。

同一のメソッド名であれば実装を一本にまとめてしまうJavaはできるが、
同一のメソッド名だが異なるインターフェースで異なる実装をもてるDelphiはアップキャストできない。

C#はどうだったかな?
後者だった気がする。

335 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 01:51:50.96 ID:paBhA78F.net]
アップキャストできない場合て、多態できなくね?
多態出来ないと、OOPの1/3位の価値が失われる気がするんだが…

ま、別にrustにOOPを求めてはいないんだけどね。

336 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 05:52:25.11 ID:/48a4Fba.net]
>>334
DelphiもC#もできるぞ……なんか勘違いしてそう

337 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 06:53:23.75 ID:va2KIQhQ.net]
>>335
Derived→Baseというtrait間のキャストができないだけで、
traitを実装した型を&Baseへキャストすることはできるけど、
それだけではたりない?



338 名前:デフォルトの名無しさん mailto:sage [2015/07/04(土) 23:29:18.24 ID:Swd5RGwS.net]
Documentation↓読んでみたけど使い方まるで分からなかった orz
https://doc.rust-lang.org/stable/book/documentation.html

どこか分かりやすいサイトあったら教えて

339 名前:デフォルトの名無しさん mailto:sage [2015/07/04(土) 23:41:44.31 ID:JArIChSh.net]
rustbyexample

340 名前:デフォルトの名無しさん mailto:sage [2015/07/05(日) 00:58:16.90 ID:D54Ug4Aq.net]
>>338
実際に rustdoc を使ってみれば慣れるだろ

341 名前:デフォルトの名無しさん mailto:sage [2015/07/07(火) 12:17:44.59 ID:6KFd5cV4.net]
implでトレイトに対して実装すると範囲が広くて使い勝手が悪くなるのを知った。

impl<T> TraitFoo for T where T: TraitBar { ... }
ってやった後、
impl<T> TraitFoo for T where T: TraitBaz { ... }
と別のトレイトも実装しようとすると
conflicting implementations for trait `TraitFoo`
と怒られる。TraitBarとTraitBazが全く関係が無いもの(例えばstd::net::ToSocketAddrsとstd::ops::Add)であっても駄目。
今、TraitBarとTraitBaz両方を実装した型が無くても、この先作られるかもしれないから、という理屈?らしい。

じゃあ impl TraitFoo for TraitBar {...} とすると、コンパイルは通るけどTraitBarを実装した型はTraitFooを実装したことにならないので、
意味が無い。

342 名前:デフォルトの名無しさん mailto:sage [2015/07/07(火) 22:52:02.79 ID:cXg5joXk.net]
Neative boundsが実装されるのを待とう

343 名前:デフォルトの名無しさん mailto:sage [2015/07/09(木) 07:18:05.44 ID:3KxMUrWp.net]
RustのTraitは正直失敗だよ
本来のトレイトとは別物だしインターフェースや型クラスとも違う
中途半端な出来損ない

344 名前:デフォルトの名無しさん mailto:sage [2015/07/14(火) 00:55:02.57 ID:vqJ6PXtp.net]
scalaのtrait implicit classを関係があるんかな

345 名前:デフォルトの名無しさん mailto:sage [2015/07/14(火) 20:39:40.07 ID:s1SvBZBN.net]
本来のトレイトって何?何がRustのトレイトに足りないの?

346 名前:デフォルトの名無しさん mailto:sage [2015/07/15(水) 16:36:48.46 ID:Kkrt7iJt.net]
本来のトレイトは実装を再利用するための機能であって
使うトレイトの組み合わせを変えるなどして実装を変えられるものだ
普通はトレイトに型システムの機能は無く
トレイト型にキャストとか出来ないし
どのトレイトを使っているのかで区別もしない
ましてトレイトの関数を再実装できるようにしてトレイト型に多態性を持たせるとか
名前が衝突してもトレイト型にキャストすれば別々の実装が呼べるとかすべきでなかった
おかげで本来の使い方が出来なくなった

347 名前:デフォルトの名無しさん mailto:sage [2015/07/15(水) 17:45:25.68 ID:4s1838+j.net]
いやだからRustでできない本来の使い方って何さ。他の言語でもいいから例をプリーズ。

Rustでも実装の再利用ってできるでしょ。Iteratorをimplするのに最低限必要なのはnextだけでいい。Readだったらreadだけ。
implする型に制限は無い。基本型にすらtraitを与えることができる。
オレオレ実装を使いたいならstruct Myi32(i32)とかすればいい。
traitは関数のみ定義できて値を持たせることはできないけど、これはimplする型全てが構造体のような形態を持っていないため。抜け道は普通にある。
traitは型ではない、型であるべきではない、という主張も正直分からない。
traitを実装したものは全て特定の関数を持っているんだから、それをまとめて型Xとするとどこに不都合があるのか。



348 名前:デフォルトの名無しさん mailto:sage [2015/07/15(水) 23:54:13.14 ID:Kkrt7iJt.net]
極端な例になるけどこれを見て欲しい
trait FooA {
 fn foo(&self) { self.bar1(); self.bar2(); }
}
trait FooB {
 fn foo(&self) { self.bar2(); self.bar1(); }
}
trait BarA {
 fn bar1(&self) { println!("A-1"); }
 fn bar2(&self) { println!("A-2"); }
}
trait BarB {
 fn bar1(&self) { println!("B-1"); }
 fn bar2(&self) { println!("B-2"); }
}
一般的なトレイトだとFooAとFooBのどちらかとBarAとBarBのどちらかを組み合わせることができる
それがトレイトの再利用
この場合トレイト型で区別しても意味が無い

349 名前:デフォルトの名無しさん mailto:sage [2015/07/16(木) 01:05:53.97 ID:AYGKegct.net]
はぁ?

350 名前:デフォルトの名無しさん mailto:sage [2015/07/16(木) 03:44:30.67 ID:xr+gKr/s.net]
その一般的なトレイトだと、FooAかFooBをミックスインした対象はbar1とbar2を呼び出せないといけないんだよね?
OCamlの書き方でやると < bar1 : (); bar2: () > というシグネチャを持っている型しかFooA/FooBをミックスインすることはできないわけだ。
その型に、例えばBarと名づけて型チェッカで検査させて都合がでるとは思えない。実際に問題は起きていない。

https://codeshare.io/5XfJ1

↑で一々implの羅列を書くのが面倒だという声に応えて>>341のようなimpl<F> Foo for F where FooA { ... }があって、
けどこれはまだ使い勝手が悪いからnegative boundがRFCに上がっている。
それも待ちきれないならnightlyのlibsyntax、あるいはsyntexを使って自動化することもできる(はず)。

他の言語だと、traitは型じゃないの?FooA+BarAをミックスインした型とFooB+BarAをミックスインした型は多相リストに入れたら駄目だったりするの?

351 名前:デフォルトの名無しさん mailto:sage [2015/07/16(木) 23:56:38.15 ID:P5KxMz2p.net]
一応トレイトの論文(Composable Units of Behaviour)があって
それを本来のトレイトと呼んでるんだけど本来のトレイトは型じゃないってのは事実
PHPのトレイトが型としての機能が無くて本来のトレイトに近い
Scalaのトレイトは型として扱うことで継承構造も再利用できるようになってるけど
Rustと違ってそれで本来の使い方が出来なくなったりはしてない

それと読み返してて思ったんだけどもしかしたら誤解させたかもしれない
今のRustでトレイトの型としての機能を無くすならトレイトの代わりになる別の抽象型が必要になる
PHPもトレイトの他にインターフェースがある
それにトレイトが型なのが問題というよりも型として強力にするために多態性を持たせたり
名前が衝突しても解決しなくていい仕様にしたのが一番の問題
そこで本来のトレイトと使い方が大きく変わってしまった

352 名前:デフォルトの名無しさん mailto:sage [2015/07/17(金) 00:25:13.89 ID:GZRy2HRh.net]
論文のタイトル正確にはTraits: Composable Units of Behaviourだった

353 名前:デフォルトの名無しさん mailto:sage [2015/07/17(金) 13:44:39.09 ID:vkp5Zmx6.net]
型とクラスを混同しているようだけど、型とクラスは違う。その論文のどこにもトレイトは型じゃないと言ってない。むしろ型以外の何者でもない。
クラスベースのOOPLは型≒クラスだけど、rustにはクラスもその階層構造も無い。
その論文で言及している、inheritance由来のデメリットはrustには存在しない。
よってトレイトがクラスベースの言語で解決してくれるような問題はrustには無く、論文の定義通りのはたらき、
すなわち「requiredなメソッドを用意したらあるメソッドをprovideする」を行っている。
「本来の使い方」という曖昧な言い方はやめてくれ。

useで明示的に指定したメソッドしか使えないのは論文の定義(トレイトをミックスインした場合と、しないで同名のメソッドを定義したものは同等であるべき)とは違うように見えるが、
クラスが無いんだからあまり変わらない。むしろあるメソッドがどこから提供されているのかを曖昧にしないのは利点ですらある。

トレイトに関する多相性というと、トレイトをミックスインした型全てを扱える仕組み(fn do_foo<T:>(f: &T) where T: TFoo {...})と、
多相トレイトを定義できる仕組み(trait TFoo<V> { ... })の2つがあるが、後者があるのがどう問題になるのか?
多相トレイトを使う時、すなわちミックスイン時には単相化されるか、多相型のパラメータに渡されるだけなんじゃないの?
そして多相トレイトをやめた場合、例えばIterator<Item=T>というものはどう実現すればいいのか。

354 名前:デフォルトの名無しさん [2015/07/17(金) 14:25:23.54 ID:Zvxj9F2y.net]
結論:オブ脳の恐怖

355 名前:デフォルトの名無しさん mailto:sage [2015/07/18(土) 21:30:37.89 ID:FAOQ/v/X.net]
まあrustのトレイトはその言葉の意味「特性」をそのまま持ち込んでいるから、シグネチャ以外の特徴の表現にも使われている。
SizedとかSyncとか。
この過剰な応用がどんなデメリットになるかはもう少し様子を見てみる必要があるとは思う。
今も初見じゃ分かりづらいエラーメッセージの元になっている。Sizedトレイトが実装されてないから駄目ってどういうこと?とか。

356 名前:デフォルトの名無しさん mailto:sage [2015/07/18(土) 22:39:00.92 ID:vVMIYXNu.net]
あの論文を読んでどうやったらトレイトを型と見なせるのか俺にはわからん
型=クラスと思ってるわけじゃないけど型という用語の認識が違うのは確かだろうね
君はRubyのモジュールも型とみなすのかな俺は違うと思ってる
正直認識が違いすぎてどう説明していいのか分からん
他言語のトレイトを使って確かめてくれとしか言いようがない

357 名前:デフォルトの名無しさん mailto:sage [2015/07/19(日) 02:51:08.17 ID:0GQY2ef7.net]
論文に書いてあるのは「トレイトはクラスではなく、クラスを構成する部品である」ということなのはいいか?
「トレイトは型じゃない」とは一言も書いてないし、それ以前に型という単語すら使ってない。言及していない。
だから型じゃないと主張するなら、自分でその根拠を述べる必要があるのは分かってるか?
クラスの無い静的型付け言語のrustでのトレイトは、
1. 階層構造が無い、あるメソッドを定義すればそれに基づいたメソッドをstruct, enum, primitiveに与えるもので、
2. (Struct | Enum | Primitive) = State + Traits + Glueを満たすんだから、
論文にあるトレイトとほぼ同義。linear compositionができるんだから使い方も間違っちゃいない。
動的型付けでは曖昧にしていた所をはっきりさせれば、多相トレイトが自然であることも分かるだろ?

話を曖昧にしたがるあなたに付き合う必要は無いけれど、ついでに適当に書くよ。
Rubyのモジュールをミックスインしたクラスから生成されるオブジェクト全てを扱えるメソッドが書けるなら、モジュールは型とみなせる。
例えばFooモジュールを作るだろ?
module Foo
def bar
 return "bar"
end
def baz(x, y)
 return x + y
end
end
で、こいつをミックスインしたクラスのインスタンスを、例えばdef do_something(f) return (f.bar , f.baz(1,2)) endに渡せるんだろ?
ならインスタンスはパラメトリック多相なFoo型を単相化したもの、と呼べるだろ。
Foo型とはメソッドbar : () -> stringとbaz : int -> int -> intを持つもの全て、だ。
動的型言語の関数に対して、静的型言語の型注釈を無理なく与えようとしたら、
殆どの関数は多相型になり、多相性を制限するもの(haskellの型クラス, OCamlのモジュール+ファンクタ, rustのトレイト, Javaのアドホック多相かジェネリクス)が必要になる。



358 名前:デフォルトの名無しさん mailto:sage [2015/07/19(日) 18:51:02.73 ID:pLL2VJtZ.net]
なるほど要するに
trait Foo {
 fn bar(&self) {}
}
となってるときにselfの型はFooだからトレイトは型である必要があると言いたいわけだ
普通のトレイトはクラスにミックスインした時にコピーされるから
その時selfの型が決まるけどそうやって曖昧にすることを許さないと
でもその考え方はやっぱりトレイトと違う
一応論文のURLを貼っておくけど
ttp://www.ptidej.net/courses/ift6251/fall06/presentations/061122/061122.doc.pdf
8ページの図にあるTCircleとTDrawingがトレイト
白丸が提供するメソッドで右矢印が必要とするメソッド
9ページの図がトレイトのミックスイン
これがRustのトレイトと同じに見えるらしいけど
俺にはむしろ5ページの図にある多重継承の例がRustのトレイトだと思ってる
そこに多重継承の問題が書いてあって実装が重複すると書かれているけど
それを>>341で解決を試みているように見える
この流れだと多重継承もトレイトだとか言われそうだけど
そうなったらもう何も言えない

359 名前:デフォルトの名無しさん mailto:sage [2015/07/20(月) 21:03:10.22 ID:oqUyaDhZ.net]
だーかーらー「思ってる」だけじゃなくて根拠を書いてくれ。どうしてrustのトレイトが多重継承と同じになるんだ?
例えば多重継承によって発生するdiamond problemをrustのトレイトを使って書いてくれ。

>>341で愚痴ったのは自分だが、あるトレイトTFooBarをimplすれば、自動的に他のトレイトTFooもimplしたことにしたい、という横着な欲求を実現しようとして、
(実現できたらtraitを使ってOOPのクラス継承を簡単に作れる)
impl<T> TFoo for T: TFooBar {...} と書いたら、自分の予想外の事態(TFooBazも同様にしたら、TFooBarとTFooBazの両方をimplした型はどうなる?)
をコンパイラが検出してエラーを出しただけの話だ。

普通に実装を羅列すれば問題ない。デフォルト実装を書けばimplにコードを書く必要もない。型SFooに対し、impl TFoo for SFoo {}と impl TFooBar for SFoo {} と書けばいいだけ。
多重継承の問題じゃない。implを多相にしたら範囲が広すぎて怒られただけの話。

rustのトレイトは、論文の通りで、継承はあるけどそれで階層構造を作るわけじゃない。
trait FooBar : Fooと書いたら、Fooの要求するメソッドをFooBarも要求する、Fooの提供するメソッドをFooBarも提供する、だけ。

impl FooBar for SFoo {...}でFooから受け継いだrequiredメソッドを書けないじゃないかと思うかもしれんが、
静的型付けの言語でFooBarとFooの関係を完全に切り離すのは利便性を下げるだけなのは分かるよな?
impl Foo for SFoo {...}と書くだけでSFooはFoo型としてもFooBar型としても扱えるようになるんだから。

360 名前:デフォルトの名無しさん [2015/07/20(月) 21:06:59.38 ID:XuKvM2I+.net]
トレイトは多相性の制限という形で不変条件を表現してるものなんだから
>>357が正しいとしか思えんけどなあ。

361 名前:デフォルトの名無しさん mailto:sage [2015/07/21(火) 21:00:10.36 ID:Nw2FJ/oz.net]
論文の5ページの図は菱形継承とは関係無い
むしろ親クラスと子クラスの2階層でも問題があることを示してる
具体的には親クラス同士の連携のために親クラスに連携用のメソッドを追加する必要があること
その連携用のメソッドを子クラスで実装しなければならないことが書かれている
Rustが名前の衝突を許すせいで分かりづらいけど名前の衝突を避ければ>>348
trait FooA {
 fn foo(&self) { self.FooA_bar1(); self.FooA_bar2(); }
 fn FooA_bar1(&self);
 fn FooA_bar2(&self);
}
となってミックスインする時にFooA_bar1を呼んだらbar1を呼ぶように実装することになる
名前を同じにしようがtrait FooA: Barにしようが実装の数は変わらない
そしてこの連携のための実装は再利用が出来ない
>>350でこの問題の解決方法として>>341を挙げてるからそれを指摘した
別に>>341のエラーを多重継承のせいにしたつもりはない

確かに論文ではトレイト間の階層構造に意味が無いことは書かれていたけど
同時にトレイトはクラスの階層構造に影響しないとも書いてあったはず
クラスとトレイト間では階層構造を作るという解釈はどこから来た?
ここで2階層になってるからさっきの多重継承の問題が出てきた

362 名前:デフォルトの名無しさん mailto:sage [2015/07/21(火) 23:59:09.59 ID:BEOiskjZ.net]
あなた「Rustのトレイトはクソ!本来の使い方ができない!」 >>343
ぼく「どうクソなの?本来の使い方って?」 >>345
あなた「トレイトは実装の再利用をするための部品。トレイトを型として扱ってるからクソ!多相性があるからクソ!」 >>346
ぼく「再利用できるじゃん。例もあるでしょ」 >>347
あなた「例えばこんなコードでトレイトを組み合わせることができない!」 >>348
ぼく「できたよ」 >>350
あなた「論文の定義と違うからクソ!トレイトがクラスになっているRustはクソ!」 >>351
ぼく「そもそもrustにクラス無いじゃん。クラスと型は違う」 >>353
あなた「じゃあお前はrubyのモジュールも型と言うんだな!話にならん!」 >>356
ぼく「rubyよく知らないけど型と呼べそうだよ。そもそも元の論文でtraitと型の関係は何も書いてないじゃん」 >>357
あなた「rustのトレイトは論文5pの図で言うところの多重継承だ!クソ!」 >>358
ぼく「多重継承じゃないでしょ。フラットになってるでしょ。Rustのトレイトが多重継承ならdiamond problemを書いてみてよ」 >>359
あなた「5pは菱型問題じゃない!お前分かってない!親子だけの2階層だけでも問題!」 >>361

363 名前:デフォルトの名無しさん mailto:sage [2015/07/22(水) 00:06:40.09 ID:pdX/k3oq.net]
あなたが書かなければならないのは、>>343で吠えたようにrustのトレイトが実装の再利用において、
本来のトレイトが解決してくれることができないこと、なんだけど1つも例を挙げてないよね。
>>348で折角「極端な例」を出してくれたが、それが>>350でrustでも書けることを示したんだが。

で、クラスと型を混同している頭ではトレイトが型なのが許せないようで、論文という他人の言葉だけを頼りにグダグダやっているけど、
第一級市民としてのクラスが無い、多相型のあるrustで、という文脈をずーっと無視しているよね。
論文は動的型付けの、継承がコードの再利用方法としてメジャーな言語の中での話、っていう文脈も無視しているよね。

トレイトは型ではいけない理由も、rustのトレイトが多重継承だと思った理由も、何にも説明してくれないからこっちで補完して反論してきたが、
もうお節介はやめるよ。ちゃんと自分の頭で考えなさい。

364 名前:デフォルトの名無しさん mailto:sage [2015/07/22(水) 13:50:02.41 ID:tlwxTsYf.net]
>>362
何を長々と、、、と思ってたらまとめが出来ていて分かった、乙

関数型の議論と同じく実用はおいといてセンシティブな定義で気に入らないのかな
定義に敏感な人は大変だなぁ

365 名前:デフォルトの名無しさん mailto:sage [2015/07/22(水) 21:55:10.25 ID:ubJIybN+.net]
論文ではまず実装の再利用に関して既存のやり方には問題があることを示した上で
その問題を解決するためにトレイトを提案してる
その問題の1つが>>350のimplで理由は>>361に書いた
結局トレイトで否定したやり方をRustはトレイトと呼んでるわけだ
Rustの文脈を無視してるというのならトレイトの目的や背景も考慮したらどうだ

トレイトが型ではいけないってのは結局俺の間違いだった
型の機能を優先しすぎてトレイトの機能を無くすのが問題だっただけで
トレイトの機能と型の機能は両立できそう

366 名前:デフォルトの名無しさん mailto:sage [2015/07/22(水) 23:45:21.91 ID:pdX/k3oq.net]
>論文ではまず実装の再利用に関して既存のやり方には問題があることを示した上で
>その問題を解決するためにトレイトを提案してる
だからその問題を具体的に、自分の言葉で説明しろよ。>>350を書いたのは俺だ。
そこにかかれているのはimpl TFoo for SFoo {}をひたすら書くのが面倒だね、ってことだけだ。勝手な誤読をすんな。
これが論文で言うcode duplicationだと思っているなら、あなたは論文を読む以前の知識が足りない。
しかも>>361で性懲りもなく親クラスなんて言葉をrustに持ち込んで妄言を吐いてるだけ。rustの何が親クラスなんだ?

トレイトの背景と目的?だから継承ベースのコードの再利用にある問題を解決するには、って分かってるから>>353
「そんな問題はrustには無いんで、論文の言葉どおりにトレイトを定義した」と書いている。

で、親クラスって何よ?>>350のどこにも親クラスなんて存在しない。

367 名前:デフォルトの名無しさん mailto:sage [2015/07/23(木) 21:35:53.52 ID:XXd04llZ.net]
Rustのトレイトを親クラス、構造体を子クラスと見なせば論文の例はこうなる
https://play.rust-lang.org/?gist=8f1db295cff07a5163e7&version=stable
SyncAとSyncBのimplがほとんど同じでA::やB::の代わりにsuperが使えれば完全に重複
論文ではこの重複も問題として扱っている



368 名前:デフォルトの名無しさん mailto:sage [2015/07/23(木) 22:25:53.21 ID:bNJIoU7G.net]
それでみなさんはrustで何作ってるんですか?

369 名前:デフォルトの名無しさん [2015/07/23(木) 22:42:51.27 ID:GSXYPmA+.net]
>>368
まあ、昔と違ってシステムプログラミングの需要って減ってるよね。
GTKかwxWidgetsのRustバインディングが安定したら何作るか考えるわ。

370 名前:デフォルトの名無しさん mailto:sage [2015/07/23(木) 22:49:25.52 ID:yXyFyEpk.net]
>>367
みなさなきゃ良いんじゃね
rustのトレイトの問題じゃなくお前さんの視点の問題だろ?

Cで作るようなシステムアプリケーションとか作ってる
基本評判悪いけど面白い言語よのう

371 名前:デフォルトの名無しさん mailto:sage [2015/07/24(金) 00:32:36.11 ID:D0ziIpoZ.net]
>>367 phpでやってみたが、減らせるコードって36-39行と47-50行だけしかなくね? codepad.viper-7.com/2A7K4h
しかもSyncAとSyncBをAを扱う関数に渡したら、syncRead呼ばれないし。継承じゃないなそれ。

学習目的もあるが、PEGをもっと広めたいなーと思って色々触っている。
DSL作るのはLispと関数型言語が楽だとは知っているけど、rustも代数的データ型とパターンマッチがあるから何とかなるんじゃないかと思っている。

std::mem::size_of_valとかで見る限り、構造体のメモリ使用量がCと同じなのが気に入った。
いくらメソッド追加してもコストにならないし、vtableが出てくるのは&Traitみたいなtraitオブジェクトを渡すときだけなのも良い。
struct Container<'a, T: 'a + Trait> {
inner: &'a T
}
のメモリ使用量はusize
struct Container<'a> {
inner: &'a Trait
}
はファットポインタなのでusize + usize

372 名前:デフォルトの名無しさん mailto:sage [2015/08/08(土) 02:29:33.62 ID:qRv1Q/E9.net]
普段ScalaとPlayFrameworkでWeb書いてるんやが、JVM嫌すぎてやめたい。
Rustさんはどうなんすかね。

373 名前:デフォルトの名無しさん mailto:sage [2015/08/08(土) 02:34:13.24 ID:6f0NYoQy.net]
Announcing Rust 1.2
blog.rust-lang.org/2015/08/06/Rust-1.2.html

374 名前:デフォルトの名無しさん mailto:sage [2015/08/08(土) 11:31:29.07 ID:vDqHzBe+.net]
>>372
JVMの何が気に入らないのか分からんが
マルチコアプロセッサで効率的な動作を期待するならgoの方が向いてる

375 名前:デフォルトの名無しさん mailto:sage [2015/08/09(日) 03:37:11.08 ID:f9auPRN7.net]
Rust1.2に付随してcargoのバージョンが上がってプロジェクトディレクトリの.cargo/configで
[build]
rustc = "multirust run nightly rustc"
とチャンネルを指定することができるようになったのが嬉しい。

前からcrates.ioのドキュメントにできると書いてあったのに、stableじゃできなかった。
3つもチャンネルがあるとドキュメントがいつから対応しているのか書く側も把握しづらいのかね。

376 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 01:45:21.38 ID:7PEu3mkB.net]
>>375
できなかった。自分でrust-nightlyとか適当なシェルスクリプトかまさないといけない。

377 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 12:36:33.87 ID:0A5qnrPY.net]
>>374
ただの技量不足なんですが、メモリ食っちゃうので…



378 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 15:02:52.00 ID:rodoarXT.net]
そりゃgoを使っても本質的には変わらんなw
rustでビルド時に厳密にチェックするのは一案かもな
最初は厳密すぎて実装効率がクッソ下がる悪夢にうなされるだろうけど

379 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 21:19:32.57 ID:gZkyyADQ.net]
rustで、機械学習やりたいんですが線形代数とかに便利なライブラリってあります?

380 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 21:32:20.79 ID:PzFzu2cW.net]
基本的なライブラリも出揃ってないんだからないでしょ。
まぁ速くて関数型だから機械学習に使いたいのは分かるけど

381 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 22:24:22.09 ID:YKJt+Rxb.net]
普通にC/C++ライブラリをブリッジしてフロントをrustで書けば良いのでは
ブラックボックスのライブラリまで無駄にrustランタイムに依存しなくて良いだろう

関数型だから(笑)で選んだなら全てがrustじゃないと気に入らないかもだが
そうじゃないと思いたい

382 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 23:14:36.16 ID:nvcb5WnS.net]
C、C++で書かれたライブラリは予想外な最適化がなされていることがあるのではないか、と
https://github.com/BurntSushi/rust-memchr/
のベンチマークを見て、
code.metager.de/source/xref/gnu/glibc/string/memchr.c
を覗いて思った。

383 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 06:56:14.33 ID:blwavvg/.net]
>>381
単純にrustに触るモチベーションにしようかと思っただけなんですが、
結局c++とかさわることになるなら、もうちょっとまってみます。

384 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 07:57:50.79 ID:OFjX8KNn.net]
そうかrustじゃなきゃヤだったか、残念だ

rustに限らず新進の言語は自分が早い、と言い張ってるが
inlineとかconstexprとか、そういう言語仕様レベルでC/C++には負けそう
スクリプト言語よりは早いし、C/C++にない言語特性で勝ってるから良いんだけど

385 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 08:20:01.82 ID:8DhgL6X2.net]
どうせバックエンドはLLVMだし、速度はなんとでもなりそう

inline指定はC++より細かくできるし
そのうちconst関数も実装されるんじゃなかったっけ

386 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 08:36:32.05 ID:+/xffdWO.net]
魔法の言葉、LLVM
LLVMを使ってれば全てが横並びになる、、、わけがねーだろ

387 名前:デフォルトの名無しさん [2015/08/14(金) 13:18:33.36 ID:MLcHO6rW.net]
CはともかくC++書きたくないからRustに期待するので…
GCないし言語仕様自体で遅くなるということはない
現状でも遅くないし、最適化はコンパイラの成熟待ち



388 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 13:23:40.07 ID:ySA2YUfa.net]
cppとかもうオワコンだろ

389 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 13:46:27.32 ID:G+XHrt0h.net]
だったらrustがzero-costを推してるのは、、、

雨後のたけのこよろしく言語乱立なう
枯れるまでC++は良い言語の一つだと思うよ

390 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 17:04:46.99 ID:mJ5T1H4E.net]
最適化といってもコンパイラができる最適化には限りがあるよ。
例えばサイズnのスライスに対してある特定の処理を書くとしたら、
slice.iter().map(|x| { f(x) }) とか書くじゃん。遅延処理になるから、その後枝刈りができる可能性はあるけど、基本的にn回処理しなきゃならない。
頭のおかしい人が&[u8]とf(x)の中身を見て、&[u64]にしてf(x)を変形させて処理がn/8回で済むアルゴリズムを考えたとき、
そいつをコンパイラに伝える方法があるようには思えない。特にf(x)の中身を見ないといけない部分が難しい。

rustでスマートに書けるところは多いけど、速度が問題になるジャンルでは簡潔さを捨てても取るべきものがある、と思う。

391 名前:デフォルトの名無しさん [2015/08/14(金) 17:18:09.99 ID:MLcHO6rW.net]
そりゃアルゴリズム変えるなら別の書き方することになるってだけでは…

RustはCとのインターフェイスが簡潔なのがよい
ほんとC++さっさと滅ばねーかなー

392 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 18:56:03.00 ID:tSzJ9MLR.net]
ちゃんと読んでないけど、アルゴリズムの書き方が言語仕様で縛られるのでは?

C++を滅ぼそうとDだのC#だの出たけど倒れる気配ないからなぁ
時代は変わったけど難しいね

393 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 20:22:55.00 ID:N/BdRhBJ.net]
滅びを願う必要ないでしょうに

394 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 23:57:05.10 ID:bS+eLMvH.net]
>>390
f(x)がinline化可能なら、コンパイラがそういう最適化できる可能性もあるのでは?
ただ、最適化突き詰めていくと今のところ人の手でしかできないようなものがあるというのはその通りだと思う

395 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 11:29:55.30 ID:LE4LycT3.net]
>>392
C#はc++滅ぼすためにでたんか
VM上で動く言語がc++の替わりになるとは思えんけど

396 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 15:00:25.90 ID:BF06i3ZJ.net]
C#の4つの+の内2つは†だからね

397 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 16:30:24.95 ID:2bLrWO8C.net]
c♯はvm言語だけどjavaとは比較にならないくらい速いぞ



398 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 19:21:36.26 ID:y8T1xilv.net]
rustのC/C++にない機能特徴ってメモリ管理以外何かある?
文法はどーでもいいので、機能面でメリットがあれば教えて頂きたく

399 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 19:44:13.49 ID:b89uyLUZ.net]
バックエンドがLLVMということは、裏返せばLLVMにできないことはどう頑張ってもできなくて
LLVMを使いこなすという点ではclangの方がずっとこなれている、ということでもあるからなあ

clangだと独自拡張やビルトインを駆使してめっさ面倒なことがrustでこんなに簡単に!はあっても
clangでできないことがrustならできる、は無いだろ

400 名前:デフォルトの名無しさん [2015/08/16(日) 00:02:58.53 ID:0FrBGB/k.net]
>>398
代数的データ型があること

401 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 08:54:35.06 ID:B/eZX+WT.net]
機能なのかね、関数型(笑)の特徴ではあれど文法の話な気が

zero-cost abstractionsってサイトのトップで言ってるけど
C++のvisual関数と違って、rust traitの抽象化はオーバーヘッドが少ない(もしくはゼロ)、、、?

402 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 15:52:42.12 ID:LltgmYR9.net]
言語の機能と文法はどう区別するべきか
言語の型システムに影響与えるものは機能に分類されると思う
rustのメモリ管理も型レベルで整合性判定しとるらしいし

その話は置いといてメモリ管理以外にも色んなファイルやソケットみたいなリソース管理
もやってくれるって宣伝しとる

403 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 17:33:48.92 ID:mucOKkH4.net]
>>399
最後の文、なんかおかしくね?

404 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 17:37:02.87 ID:P0XQ+1Fa.net]
Rustのtraitは&TとかBox<T>とかって形以外で使う分には完全にゼロコスト。C++のtemplateと一緒

405 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 19:29:02.58 ID:y6uPjVhI.net]
visual 関数…

406 名前:デフォルトの名無しさん [2015/08/16(日) 20:25:28.98 ID:kniDeEJc.net]
>>401
ADTのない言語でパーザやコンパイラなんか絶対に書きたくない

407 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 20:32:14.50 ID:+yYCxpZd.net]
>>404
C++のvirtual関数だって静的に解決できる範囲だと普通の関数呼び出しだぞ
結局、必要なとこではやっぱりコストがかかりますという当たり前の話でしかない



408 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 20:45:48.84 ID:MwsW2pbd.net]
>>402
プログラマじゃなくユーザにメリットある影響なら機能的な意味と見なしたいな

メモリやリソースは解放漏れでユーザに悪影響出るが、代数的データ型は影響無さそう
型情報を納めるためのメタデータが必要で
(極少量とは言え)性能が落ちるならカティンとくるがまさかそんなこともあるまい

409 名前:デフォルトの名無しさん [2015/08/16(日) 20:54:28.62 ID:kniDeEJc.net]
>>408
>型情報を納めるためのメタデータが必要で
>(極少量とは言え)性能が落ちるならカティンとくるが

頭おかしい

410 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 21:05:51.13 ID:+yYCxpZd.net]
ユーザへのメリットというなら、まずライブラリの形式がrlibとか特殊入ってる時点で……
もちろんVM言語よりは遥かにましだけど

411 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 21:06:48.25 ID:ffOxBAui.net]
>>406
君が出来なくても賢い人が作ってくれるとからどうでもいいな

>>407
原則、静的解決出来ないことがない言語仕様が差別化なのかねぇ
これに限らず、ブレを許す気がないコンパイラなのが愉快

412 名前:デフォルトの名無しさん [2015/08/16(日) 21:10:29.90 ID:kniDeEJc.net]
>>411
>君が出来なくても賢い人が作ってくれるとからどうでもいいな

コンパイラもパーザもそういうもんじゃないんだけど……
まあ、環境の違いかな

413 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 21:16:25.34 ID:+yYCxpZd.net]
>>411
『&TとかBox<T>とかって形以外は』の部分はどこ行った

414 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 21:16:51.88 ID:YpDp9c6J.net]
>>410
一応、普通のstatic, shared libraryにも変換出来るし、、、
(付与されるランタイムのオーバーヘッドがC++のソレとどの程度違うかは知らん)

415 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:08:36.25 ID:jt+RDWuc.net]
Ownership と Borrowing はなんとか付いていけたけど
Lifetimes は,なにがしたいのかすら解らない...ショボン

416 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:17:23.38 ID:rxm0/YIk.net]
trait objectとそれ以外が陽に異なるから、オーバーヘッドの有無が分かりやすくていい。
C++に無さそうなのって、Phantom型とか?

ADTもパターンマッチをバリバリ使うのに必要な機能。
見た目enumなのがC,C++のenumと混同しちゃうかもしれんが、あれとは安全性のレベルが違う。

417 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:39:45.12 ID:t+fZbGif.net]
C++にPhantomタイプがない・・・?
それともRustのは別のものを示す語彙なのか?



418 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 01:03:54.38 ID:wXUvnq59.net]
急に人増えたけどなんかあった?

419 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 08:15:46.05 ID:EwR31uEA.net]
実は増えてないとか?

420 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 09:22:50.55 ID:++j4diFB.net]
>>413
&TやBox<T>多用するのはイクナイrustプログラムの可能性が微レ存?

421 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 09:33:55.34 ID:Fu9VunjR.net]
RustとSwiftはそっくりなんだから統合しちゃえばいいのにな

422 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 09:50:54.17 ID:S2KJYKrv.net]
そっくりか、心が広いな

423 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:12:49.16 ID:OjKjgwDq.net]
rustもswiftもgoも好きで使ってるけどswiftはgoと統合して欲しい
gc以外は感情論を持ち込まなければなんとかなりそう

rustは不毛な大地を一人でどうぞ(好意的な意味で

424 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 22:06:52.82 ID:qu3dwpPf.net]
>>423
swiftとgoを統合の意味がぜんぜんわからないな。
goにGenericsが入ってほしいという話ならわからなくもないけど。

swiftはCocoaライブラリの互換性に縛られて言語仕様として洗練されてない。
goはシンプルを極めすぎて、Genericsとか入れてくれない予感。

rustはLLVMのフロントエンドってところでマルチプラットフォームな言語として一番期待できるよね。(swiftはCocoaがない環境で息できないでしょ)

UE4でC++の代わりにrustを使えないかと妄想してます。

425 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 22:34:16.53 ID:XjHdii/s.net]
swiftの文法とgoの機能が合わさり最強に見える

rustは言語仕様と標準ライブラリが安定してユーザが定住するならなぁ
ユーザ数少ないのにマルチプラットフォームとか誰得だ
特色違えど言ってることがLuaと変わらんので笑える

426 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 23:35:52.17 ID:rr3yinc6.net]
swiftが底センスなのって互換性が原因かなあ
単純に設計者が(ry

427 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 03:11:58.06 ID:1Gz3JsMv.net]
言語設計したAppleを責めるのはヤメロ

>>424
UE4って組み込み環境じゃなくゲームランタイムか
UE4知らんけどstatic library食えるならrustもいけるんじゃね
クロスコンパイラのrustc,cargo作れば良いわけだろ



428 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 11:59:33.30 ID:6CH1l8he.net]
swiftはアップデートするたびにcppに近づいてるな(悪い意味で)

429 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 15:10:15.72 ID:JJlPzozZ.net]
replか、rustの機能に合わせたスクリプト言語、あるいはコンパイラにキャッシュが欲しいです。
crateはコンパイル単位としてはでかすぎて開発サイクルが落ちまくるわ。

430 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 19:05:12.42 ID:lKgof8/J.net]
富豪プログラマ乙

環境一式が提供されれば便利だけど、ないならないなりに自前で便利な環境作れば良いと思うよ

431 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 20:23:20.16 ID:TcFY2I1R.net]
>>429
https://github.com/murarth/rusti

432 名前:デフォルトの名無しさん [2015/08/20(木) 20:47:55.40 ID:5WCLlVT0.net]
REPL使えるのはありがたいなあ

433 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 21:43:41.45 ID:JyBfu5gS.net]
>>430
富豪じゃないって話だろ?

434 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 10:13:08.54 ID:EXDgxhBq.net]
言語は富豪じゃなく、プログラマが富豪感覚って話だろ?

昔、Pythonをログインシェルにする機構があったが
Rustをログインシェルにする強者は世の中にいるかね

435 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 10:35:52.76 ID:Gi1OdVG4.net]
自前で便利な環境ってどんなの?cargoのソースを少し弄っては動かして、ってのをやろうとしたことがあるけど、
自分のPCだと再コンパイルに何分もかかって苦痛の極みだった。
printデバッグはcrateがある程度大きいと役に立たない。
rust-gdbを使ったものの、メソッドをどう呼べばいいのか分からなくて難儀した。

最終的に特定した不具合はrust-1.1のstableで配布されていたcargoのバージョンが古すぎて
crates.ioのドキュメントにある機能が実装されてなかっただけだったんだけどね。徒労でした。

436 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 10:49:21.79 ID:DVHNG28Q.net]
rustを使わなくて良いと判断することが良い環境じゃないかな

コンパイラ、デバッガ、ライブラリ管理、IDEをMozillaが綺麗に整備する気ないから
他の流行りの言語に比べて環境は人によってマチマチになるのが必然で問われても最適解はないよ

低レイヤーかつメモリ、リソース管理が楽なrustだけど開発環境は中々に不毛だと思う
オールインワンな用意されたモノが良いならswiftが最強、アポーOS内なら文句出ない

437 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 14:11:14.16 ID:2b/ywy3L.net]
静的型付けでIDE使えないとかなんの罰ゲームだ



438 名前:デフォルトの名無しさん [2015/08/23(日) 14:36:11.06 ID:myL1fwDZ.net]
インクリメンタルなコンパイルもIDEに情報渡すためのコンパイラ側のサポートも
わりと優先度の高い開発目標になってて実際に着手してるから時間の問題

439 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 14:49:20.21 ID:DiK7bPRN.net]
型推論と静的型付けを混在してんのか?
静的型付けならC言語すらそうなわけだが
百歩譲って静的型付け+型推論としてもC++11が標準IDEなしで頑張っとる

emacsでもvimでもsublimeでもAtomでも好きなIDE(エディタ)使えよ
自分で選べず罰ゲームだと思うなら、まだ早い

440 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 15:29:12.91 ID:vCSJ96fF.net]
最強ideとして名高いintellij様がその内rustも対応するだろ(鼻ほじ)

441 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 17:12:50.17 ID:kGlhzngs.net]
>>439
誰も型推論の話はしてなくね?
実際cやらcppでインライン構文チェック、補完できるエディタなんて普通にだろうし

442 名前:デフォルトの名無しさん [2015/08/23(日) 19:11:10.03 ID:myL1fwDZ.net]
>>441
とはいえ、Rustのように型推論がある言語だとコンパイラが型推論した
結果をIDEに伝えてくれないとマトモな補完はできないので。
パーザと型検査機・型推論機に特化したツールを用意するか、
コンパイラが型推論の結果を別ファイル化なんかで伝達するかしないといけない

443 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 19:26:43.38 ID:/Chtfvs+.net]
>>442
rebuildfmでtypescriptがIDE用にアノテーション情報をコンパイラが提供してると聞いた。
golangは言語としては提供してないけどgocodeってツールがそういう役割してる。
rustは今のところない感じ?

444 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 20:29:46.00 ID:TP37Tp0e.net]
racerとかいう補完ツールがあるけど、中身がどうなってるかは知らない

445 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 11:33:37.99 ID:LydH6mPU.net]
ctags程度のインデックスファイル作成かな > racer
型推論した上で、その型がどんな名前のメンバ変数/関数が扱えるのかまでは補完してくれなさそう

>>441
型推論込みでコード補完してくれるIDEがないと罰ゲームだって話だろ、多分

446 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 14:35:52.72 ID:ILt1JEYe.net]
変数に別名を与える構文とか出来ないかな
refだと所有権の貸し借りが発生するせいで気軽に使えないからね
同じ変数に対して複数の名前で同時に読み書き出来る状況になるけど
Rustではそういうのもデータレースと見なすのだろうか

447 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 14:44:45.63 ID:h1iic6zY.net]
それがメモリ管理のバグを生むから許せねーってのがrustの理念だろうよ
多用するもんじゃないだろうけどArcとか使えば良いんじゃね



448 名前:デフォルトの名無しさん [2015/08/29(土) 15:27:58.89 ID:hP/roqxQ.net]
ML系みたいに型の構文を関数定義から分離して欲しい…
少し複雑になると読みにくくてかなわん…

449 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 16:06:46.95 ID:PwA9Vh//.net]
ML系統も変数:型だけど、valに相当する構文を入れて、定義の所では省略したいってこと?
val foo : i32 -> i32;
fn foo(n) { n * 2 }
個人的には賛成。

多相型に対してimplを書くとimpl<'a, T1, T2, ...>が続いて読みにくくなるのも何とかならんかな。
punningというか、同じ文字を使っているなら省略してもオッケーみたいな。

450 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 16:42:49.79 ID:vqRxT/fZ.net]
>>446
他の言語ならあるの?

451 名前:デフォルトの名無しさん [2015/08/29(土) 17:10:08.52 ID:hP/roqxQ.net]
>>449
そうそう。定義内に入ってると読みにくくて読みにくくて…

452 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 17:27:04.02 ID:r87Lb3Gh.net]
>>450
Cのポインタで出来るんじゃない?

>>449
タイプ数、ライン数を増やさんで欲しいな
今の仕様に追加なら見て見ぬふりしよう

453 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 17:36:28.28 ID:vqRxT/fZ.net]
>>452
それだと本質はrefと変わらなくね?

454 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 17:51:33.64 ID:sBKhQngs.net]
>>450
Cならunion、Pascalならabsoluteがあるよ

455 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 18:24:22.69 ID:u5YtsQ0V.net]
単に長い名前を一時的に短い名前にしたいだけだろ
Dのaliasみたいな
unionやabsoluteは別の型でオーバレイするので用途が違う

456 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 19:18:35.10 ID:x4JINQUQ.net]
Cならcpp経由の#defineか
rustでもrustcかける前にcppかまそう

457 名前:444 mailto:sage [2015/08/29(土) 21:38:49.53 ID:ILt1JEYe.net]
すまん言葉足らずだった
>>446>>455の言うように長い変数名を短くするような使い方を想定していた
>>456のやり方みたいにコンパイル前に名前を置き換えるだけでもいけるから
データレースは起きないと思ったんだ
他の言語だと所有権のチェックが無いからrefのような参照変数で十分代用できる



458 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 07:01:42.91 ID:HJK6L9Ls.net]
そういう無駄な他言語仕様の取り込みは要らない
一見変数名が短くなって特定箇所はシンプルに見えるが
全体のコードからすれば簡素にするではなく、複雑にするだろ

459 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 07:12:12.11 ID:9R41/ZIA.net]
まあまあ
今はいらんかもしれんけど、本格的にいろんな環境で使われだして環境差を吸収しないといけないとなってくると
そういう機能も必要になってくるよ
他言語にある機能だって無駄に存在してる訳じゃないからな

460 名前:デフォルトの名無しさん mailto:sage [2015/08/31(月) 11:07:32.54 ID:tdAWRFGn.net]
長い変数名ってjavaのメンバ変数みたいな?

想定しているコードがよく分からん。aliasと元の変数が同時に出てくるコードの可読性は低くないか?
自分だったら↓みたいに元の変数からmoveさせて処理した後に元に戻すようにすると思う。

#[derive(Debug)]
struct Foo {
x: i32,
y: i32
}

#[derive(Debug)]
struct Bar {
verylong_named_variable_which_will_be_moved : Foo
}
fn main() {
let mut bar = Bar { verylong_named_variable_which_will_be_moved: Foo { x: 100, y: 200 } };

let mut a = bar.verylong_named_variable_which_will_be_moved;
a.x = 10;
a.y = 20;

bar.verylong_named_variable_which_will_be_moved = a;

println!("bar = {:?}", bar);
}

461 名前:デフォルトの名無しさん mailto:sage [2015/08/31(月) 13:07:11.54 ID:yj9JwLwE.net]
444の意図とは逸れるかもしれないけど

例えばerrnoなら実際はerrnoだったり_errnoだったり__errorだったり
environならenvironだったり__environだったり*(NSGetEnviron())だったりする
stdinだったら__stdinpだったり__sF[0]だったり(&__iob_func()[0])だったり……
それがヘッダファイル中で#defineされているから、C言語からはどの環境でも同じ名前で使えるわけだ

今は処理系もひとつで動く環境も限られているから表面化しないかもしれないけど
普及と同時に差も広がっていく中で #[cfg(〜)] 使って全ての環境分書き分けろってなったらやってられんと思う

……というつもりだったのが>>459

462 名前:デフォルトの名無しさん [2015/08/31(月) 13:48:51.45 ID:gJdrS6xb.net]
まあ、低レベル言語でどこまでの抽象化を許すかは難しいよな

463 名前:デフォルトの名無しさん mailto:sage [2015/08/31(月) 15:10:03.72 ID:Dkk0mMpb.net]
Cでは#define, ifdef使う所を、rustでは#cfg使うのがrustの出した解決策なんじゃなかろうか

464 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 13:12:24.79 ID:Qh110XSL.net]
#cfg濫用は心配することないと思うけどな。
現在でもwinとlinuxとOSXがサポート対象だけど、環境の違いを陽に扱うコード以外は#cfg使って書き分けるなんてやってない。

Cでは抽象化の手段が少ないからプリプロセッサ使わないとやってられないが、
rustならトレイトとかコンテナ型を使って、ゼロコストで環境の違いを吸収できるのではないだろうか。

465 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 19:40:34.17 ID:PM7GVPA4.net]
iOSとAndroidと、それらの各種CPUを対応しててくれてありがたいんだが、libcの#cfgがバグってて悲しい
rust/src/libcは直ってるようなので、gitのリビジョン参照の更新待ちだい

466 名前:デフォルトの名無しさん mailto:sage [2015/09/18(金) 08:13:22.55 ID:qEC88fFW.net]
1.3来てるぞ

467 名前:デフォルトの名無しさん mailto:sage [2015/09/18(金) 10:09:51.13 ID:qiV5MD3f.net]
Release Notes v1.3.0
https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-130-september-2015



468 名前:デフォルトの名無しさん mailto:sage [2015/09/23(水) 23:21:07.14 ID:IGgDNXyV.net]
メソッドをオーバーロードするのにトレイト組み合わせなきゃならんのは何で?
オペレータのオーバーロードと方法を合わせるためなんか?

469 名前:デフォルトの名無しさん mailto:sage [2015/09/24(木) 00:52:09.13 ID:lP9arsTC.net]
型推論が面倒になるからじゃない?

仮にオーバーロードができたとして、2つのメソッドdo_somethingがそれぞれAsRef<str>と&Stringを引数として渡せるとしたら、
let bar = "abcde".to_string();
foo.do_something(&bar)とやったとき、どっちのdo_somethingを呼ぶべきか分からない。

470 名前:デフォルトの名無しさん mailto:sage [2015/09/25(金) 18:26:11.73 ID:R+TRhKVr.net]
try! が使えなくなってるような

471 名前:デフォルトの名無しさん [2015/10/06(火) 23:08:05.18 ID:GvY89Hx4.net]
>>470
使えるよ?
戻り値の型と合ってないとかでは。

472 名前:デフォルトの名無しさん mailto:sage [2015/10/30(金) 08:18:22.20 ID:pCPlChjw.net]
1.4来た

473 名前:デフォルトの名無しさん [2015/10/30(金) 10:46:42.92 ID:IKqzpUXy.net]
スタートダッシュはもたついたけど地道に進んでるようだな。

474 名前:デフォルトの名無しさん mailto:sage [2015/10/30(金) 22:03:45.74 ID:wx6dAr+H.net]
この言語って将来性ある?
軽量タスクをあきらめた時点で多くの期待を裏切った感があるけど

475 名前:デフォルトの名無しさん mailto:sage [2015/10/30(金) 23:07:12.55 ID:r01g6EEx.net]
裏切られたのお前だけじゃね?

476 名前:デフォルトの名無しさん [2015/10/30(金) 23:57:05.43 ID:FTBRryE0.net]
ランタイムを持たずに低水準を弄ろうというシステム向け言語で
デフォルトでグリーンスレッドをサポートとかそりゃ無理でしょ

ま、需要があればライブラリで提供されるだろうさ

477 名前:デフォルトの名無しさん mailto:sage [2015/10/31(土) 00:17:04.93 ID:qwGp3Rk5.net]
scala使っとけよ
いい言語だぞ



478 名前:デフォルトの名無しさん [2015/10/31(土) 00:44:50.75 ID:L1WutJvq.net]
>>477
何故にそこでscala?
scalaやるくらいならocamlやる。
JVM上でってことならいっそのことclojureやるわ。

479 名前:デフォルトの名無しさん mailto:sage [2015/10/31(土) 03:33:05.27 ID:F9rGVxSD.net]
476がなぜそんなにscalaを嫌ってるのか少し気になるw
まぁscalaもocamlもclojureもRustからは遠い言語だけど。

480 名前:デフォルトの名無しさん mailto:sage [2015/10/31(土) 04:11:48.61 ID:/cAGFdj7.net]
嫌ってる訳じゃないだろ。他に良い言語があるのに、ってだけで。

481 名前:476 [2015/10/31(土) 06:37:08.04 ID:L1WutJvq.net]
うんscalaが嫌いってわけじゃない。
ocamlやclojureがもっと良い言語とも言わん。
単に何故にRustのスレでscalaが出るって思っただけ。

482 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 12:41:15.36 ID:ptDOELGY.net]
OCamlがRustから遠い言語だと!letやらOptionやらを見ればOCamlの香りがするだろう!
OCamlの型システムを魔改造して、ガワをC++やJavaにして、ついでにGCも取っ払ったらRustだろうが!

使えば使うほど「OCamlならもっと楽に書けるなーこの式」とか思っちゃうくらいには近いぞ。
というか何故しなかったのか。
パターンマッチのデリミタを|から,にしたり、ジェネリック型の表記をT ListからList<T>にしたり、
式をML系列(foo x y)からalgol系列(foo(x,y))にした理由が未だに分からない。
括弧の量が増えて困る。

483 名前:デフォルトの名無しさん [2015/11/07(土) 13:31:16.74 ID:dEyvNDQG.net]
そりゃ「から〜にした」っていうのが単に480の習得順序なだけだからでしょ。

484 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 13:32:09.75 ID:7OElurpY.net]
ML系列流行らないからじゃない?話はずれるがOCamlも一旦キーワード整理しなおした文法2.0作らないとツギハギちょっとひどい。

485 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 16:22:53.29 ID:G421Olyl.net]
いっそのこと他人との情報交換はASTレベルで取って、構文解析レベルの表面的な文法は各自で着せ替え可能にしてしまえ

486 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 16:43:13.48 ID:2WRIWoj2.net]
OCamlには既に文法2.0も>>485の言う機能も完備されているが、誰も使っていないという事実がある
ttp://caml.inria.fr/pub/docs/manual-camlp4/manual007.html

487 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 18:38:30.39 ID:qNyFmib8.net]
>>484
> ツギハギちょっとひどい。

たとえばどんなとこが?

> キーワード整理しなおした文法

どこをどういうふうに?



488 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 22:37:40.80 ID:ptDOELGY.net]
OCamlのRevised Syntaxはcamlp4で拡張する用途がメインだし、作った側も推進しているわけじゃない
F#のlightweight syntaxとはちょっと違う。

>>483 いや、色々な言語を触ってはきているけど、ML畑が主では無いよ。
感じるのは、関数型言語で便利だった機能を持ってきているけど、
よく考えてC++やJavaの見た目にしているのかが分からない、引っかかってるだけなんだ。
パターンマッチは、どうしてわざわざ","で区切るのか。orパターンで"|"も使うのに。
match expr {
| p1 | p2 => doA
| p3 => doB
}
の方が、"|"がORの意味を持つという慣習とも意味が合っていい。
今だと、
match expr {
p1 | p2 => doA,
p3 => doB
}
とdoAの後にセミコロンより見えにくい","を打つか、あるいはSQL的に
match expr {
p1 | p2 => doA
, p3 => doB
}
と書くかしないといけない。 どちらも"|"をデリミタにしたときより見づらいと思う。

489 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 22:50:12.70 ID:Y3AuFW+E.net]
構文見た目とか細かいところなんて慣れだろ。
多言語から来たらそこは我慢しないと

490 名前:デフォルトの名無しさん mailto:sage [2015/11/07(土) 22:53:45.07 ID:DDUHJOjM.net]
match expr {
| p1 | p2 => doA
| p3 => doB
}
なんかdoAにorが掛かってる様に見えるのと、行頭の|が気になる
自分がC++使ってるから?

まぁ、C++もRustも仕事で使ってるわけじゃないのでどんな形になっても別に構わない

491 名前:デフォルトの名無しさん mailto:sage [2015/11/08(日) 10:05:07.36 ID:GO2ytGEi.net]
>>488
p1をブロックに渡してるのかと思った

492 名前:デフォルトの名無しさん mailto:sage [2015/11/16(月) 20:54:36.21 ID:V5pjynAM.net]
最近やっとstd::borrow::Cowの便利さに気付いたんだけど、
Stringと&strのどちらも受け取ることができて、StringだったらCow::Owned、&strだったらBorrowedに渡すなんて関数作れませんかね?
今は無難に関数を分けています。

493 名前:デフォルトの名無しさん [2015/11/16(月) 21:26:26.44 ID:86x+5+3M.net]
enum で包んで直和型にして渡すとか?
全然便利じゃなさそうだけど。

494 名前:デフォルトの名無しさん mailto:sage [2015/11/17(火) 00:49:23.01 ID:UWdMMjpw.net]
関数でなくても良いなら、IntoCowみたいなtrait作って、Stringと&strのそれぞれに実装する方法はある

495 名前:デフォルトの名無しさん mailto:sage [2015/11/17(火) 01:01:07.60 ID:zQmfn/gi.net]
rust書いたことないんだけど、traitってscalaのtraitと同じようなもん?

496 名前:490 mailto:sage [2015/11/17(火) 13:46:41.92 ID:S0yggN9e.net]
>>493,492
無闇にto_string()でStringに変換しないのが主目的で、もっといいコンテナ型があればと思ったのですが、
まあ別の関数にしておくのはそんなに手間でもないのでこのままで行きたいと思います。ありがとうございました。

>>495
型の定義時にtraitを指定する必要が無いので、型クラスの方が近しいのではないかと。

497 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 15:58:21.22 ID:1aaEMzFy.net]
rust-encodingが遅いと勝手に思い込み、iconvのバインディングを書いて2倍以上速くなったと喜んでいたものの、
--releaseオプションをつけたらほぼ同じ程度の速度になった。
無駄な労力をかけるより先にやるべきことがあったわ。



498 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 20:40:38.49 ID:CwO1C40T.net]
悲しいな
ちなみにリリースビルドの性能でも若干遅いのかしら

499 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 20:59:57.88 ID:S24jZK/l.net]
性能以前に、rust-encodingとiconvならiconvを使いたいと思うわ、信用が違いすぎるだろ。だから公開はよ

……と書こうとしてぐぐったら、もう幾つもあるなw

500 名前:デフォルトの名無しさん mailto:sage [2015/11/21(土) 22:36:25.09 ID:1aaEMzFy.net]
debugでコンパイルすると、encoding, iconvの所要時間はそれぞれ
3.85user 0.15system 0:03.97elapsed 100%CPU (0avgtext+0avgdata 50216maxresident)k
1.65user 0.15system 0:01.78elapsed 101%CPU (0avgtext+0avgdata 50108maxresident)k

で、releaseでコンパイルすると、
0.33user 0.14system 0:00.45elapsed 106%CPU (0avgtext+0avgdata 50272maxresident)k
0.30user 0.14system 0:00.42elapsed 105%CPU (0avgtext+0avgdata 48132maxresident)k

ってなった。stableなんで#[bench]は使えないので/usr/bin/timeを使った。
iconvがwindowsで使えるかが分からないし、誤差レベルなんでencodingをお勧めする。
ちなみにhttps://github.com/andelf/rust-iconvで公開されてるやつは古いのでコンパイルを通すのに修正が必要で、
https://github.com/ogham/rust-locale内にもIconvがあるけど、自分が触った限りだとうまく動いてくれなかったんで作った。
rust-posixのは本当に単なるラッパーなんで使い勝手は悪いかもしれん。

https://github.com/y-stm/rust-iconv
rust-encodingはrustネイティブだから、windowsにもちゃんと対応しているはずなんで、そっちの方がいいと思うよ。

501 名前:デフォルトの名無しさん mailto:sage [2015/11/22(日) 11:23:58.32 ID:NWCv//56.net]
細かい情報thx
これは確かに誤差だから素直にrust-encodingで良いね

最近、枯れたと思われてるライブラリのバグ発掘が盛んだから
リメイクしたライブラリで性能同等ならそっちでいいな

502 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 21:28:29.71 ID:X3qMkrgd.net]
構造体のmutable referenceからはフィールド変数をmoveできないのがどうにかならんのかと思って調べてみた。
mem::replaceが解決案らしい。
struct Foo {
inner: Bar
}
struct Bar(i32);

fn main() {
let mut foo = Foo { inner: Bar(0) };
{
let ref_foo = &mut foo;
let inner = ref_foo.inner;
}
}
とかやるとcannot move out of `foo.inner` because it is borrowedと怒られる。

例えば、Iteratorの値を1つ保持するフィールドを用意して、要素を戻すような操作ができるstructを定義しようとすると、
この問題にぶち当たる。

503 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 18:36:59.97 ID:8KiFs03m.net]
v1.5 is coming.

https://github.com/rust-lang/rust/blob/master/RELEASES.md

バージョンアップ早いなあ。

504 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 21:23:50.15 ID:iuSy02/G.net]
このまえ1.3入れたばっかなのに俺w

505 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:48:09.38 ID:nmaVejT0.net]
ここ最近、2ヶ月でアップデートしてるのか
何かブーストする背景があったのかね

506 名前:デフォルトの名無しさん mailto:sage [2015/12/12(土) 01:15:24.78 ID:li1FzsOW.net]
MSVC ABI普通に使えないやんけ…

507 名前:デフォルトの名無しさん mailto:sage [2015/12/12(土) 01:47:25.84 ID:8e55vxAw.net]
1.0リリースする前から6週間ごとにリリースするモデルにすると宣言してたぞ



508 名前:デフォルトの名無しさん mailto:sage [2015/12/12(土) 14:03:48.98 ID:RsNWaaLF.net]
マイクロバージョンアップの bug fix リリースじゃないのな
その内、wineみたいに1.100とか来そうだw

509 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 04:08:28.28 ID:QsQbNVbs.net]
ある、イテレータをメンバーに持ってる構造体のmutable参照を受け取って、
イテレータを回して何か処理して、結果をその構造体の別のメンバーに保持させたいんだけど、for使うと怒られる。

と思ってたが、別の変数にイテレータメンバーへのmutable参照をバインドさせれば動くことが分かった。
loopとif let使ってなんとかしてたが、綺麗に書けることが分かった。
ttps://play.rust-lang.org/?gist=12ad0e190d1b7ffdae21&version=stable

510 名前:デフォルトの名無しさん mailto:sage [2016/01/15(金) 23:06:47.72 ID:27wkGJB0.net]
rusr入門の書籍の出発前予定ってありますか❔❓
新しい概念あるので日本語で勉強にしたいです。

511 名前:デフォルトの名無しさん mailto:sage [2016/01/16(土) 17:51:41.42 ID:yIqkNKKT.net]
残念ながら日本語の本が出るなんて話は聞いたことがない。
1.0になるまでに文法やらセマンティクスやらが変わったんで、それ以前のブログ記事やSOの質問には注意が必要。
Qiitaで公式bookの日本語訳を書いてた人もいたはずだけど、分からないところがあったら英語のリソース漁る方が早いと思う。

Rustの前にどんな言語を触っていたかは人それぞれなんで、新しく学ばないといけない概念も人それぞれ。
C++を触っていた人なら、明確なmove/copyの区別はすぐ分かるだろうし、borrow checkerの働きも理由を察することができるはず。
Rubyistだったら、Rust for Rubyistという記事がある。英語だけど。
ML系列の人だったら、RustのパターンマッチやADTは当たり前に分かるだろうし、Traitも型クラスみたいなものなので簡単。

Rustならではの新概念、といえばborrow checker(ownership, borrowing, lifetime)くらい。
borrow checkerは自作の型に参照型のメンバーががあるときは地獄のようだが、それ以外で怒られるときは分かりやすいエラーを出してくれる。
これさえ読めばすぐ分かる、完璧!という記事/本は英語圏でも無いんじゃないか。あったら教えてほしいくらい。

512 名前:508 mailto:sage [2016/01/16(土) 23:27:33.74 ID:z5FTR37d.net]
>>511
そうなんですか、当分出ないのかなぁ。1.0でたから
出版考える人居るかと思いました。

後はオライリーのが出版された後に翻訳されることを期待ですかねぇ。
英語の峰もまだ出版は先みたいですが…

513 名前:デフォルトの名無しさん mailto:sage [2016/01/17(日) 09:31:02.77 ID:q1eYL5ZR.net]
公式ドキュメントのThe Rust Programming Languageが要所を押さえて普通に分かりやすかった
日本語訳を探せばみつかるんじゃないの

514 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 20:08:53.13 ID:NZ+VESGj.net]
1.6リリース。
ttp://blog.rust-lang.org/2016/01/21/Rust-1.6.html

libcoreがstableに -> 組み込み分野でstableバージョンのrustcが使えるようにするための第一歩。
現状、no_stdが使えない&libcore自身もstableじゃビルドできないんで、組み込み分野でnightlyを使うべきなのは変わらず。

crates.ioのパッケージは依存関係に*を使えなくなった -> パッケージ間の信頼性が上がったと思う

515 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 20:08:53.78 ID:TxuZu1KE.net]
紙の本でプログラミング言語を学ぶって不便じゃないか

516 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 23:51:29.07 ID:LnlCczkn.net]
全画面でエディタor IDE開いてるからなぁ…サブディスプレイほしい

517 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 07:16:12.42 ID:k3yqR1GN.net]
GNU screen等のウィンドウ分割でも使えば?と思ったが
最近の子がそれを知ってる気がしないと思い直した

>>514のスラドっぽいリリース紹介はなにを意図したもんなんだか
わざわざ毎リリース紹介してくれなくてもいいんだぜ?



518 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:07:32.49 ID:GlCJ8Anu.net]
スラド……?
GNU screenって、ターミナル上で動くエディタはともかくテキストブラウザでも使わせる気か

519 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:55:01.06 ID:k3yqR1GN.net]
だから最近の子は使わないと思った
首も手もホームポジションから動かす必要なくて良いんだけどな

520 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 16:37:28.48 ID:TWxXeAW8.net]
スラドっぽいとか言い出すのはスラド脳なのだろうか。

521 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 17:25:20.81 ID:GlCJ8Anu.net]
えっと最近はscreenよりtmuxなんだっけ
https://tmux.github.io/

522 名前:デフォルトの名無しさん [2016/01/24(日) 03:15:01.30 ID:6zzJ2ABK.net]
>>521
です。

523 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 09:23:05.78 ID:sP2ua92H.net]
ム板がみんなスラッシュドットジャパンを知ってると思うのは大きな間違い

524 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 20:57:50.80 ID:STxspeQw.net]
あの書き込みのどこがスラドっぽいのか分からない
日本語プログラミング系コミュニティは2chかスラドかみたいな人なのかな?

525 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 20:59:27.48 ID:MrtO9MQc.net]
スラドって大学教授が見てるイメージ

526 名前:デフォルトの名無しさん mailto:sage [2016/02/05(金) 13:54:26.47 ID:cvzC3wrO.net]
今更だが、スラドに食いつきまくりで皆知ってそうだと思った

527 名前:デフォルトの名無しさん mailto:sage [2016/02/10(水) 21:23:19.46 ID:Lqy2URw7.net]
英語版スラドの現状
https://www.reddit.com/r/rust/comments/449tcd/slashdot_rust_16_released/czomgoi



528 名前:デフォルトの名無しさん [2016/02/12(金) 23:49:15.56 ID:duitB1tZ.net]
FFIを使って他言語からRustの可変長引数の関数を呼びたいのですが、どのように書けばいいのでしょうか?

529 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 08:36:52.61 ID:I59nNjTY.net]
Rustに可変長引数の関数はないはずだが

530 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 18:14:55.11 ID:tVuFpQtK.net]
マクロの事やろなぁ

531 名前:526 [2016/02/13(土) 19:09:31.65 ID:ZWZaKmBv.net]
可変長引数の関数無いんですか…
おとなしくCかC++使います…
ありがとうございました。

532 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 20:42:45.90 ID:tVuFpQtK.net]
あなたが可変長引数関数と呼んでいるものは恐らく実在する

533 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 01:39:23.29 ID:+Fbk6tbu.net]
rust入門的なドキュメントください。
流石に一番最初から英語はきついので、、、

534 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 02:29:50.02 ID:+Fbk6tbu.net]
>>533
自己レスですがありました。

rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/

535 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 18:55:36.94 ID:+Fbk6tbu.net]
Rustを勉強するのにいい大きさのオープンソースなプロダクトってありますか?
Servoみたいなおおきい物じゃなくて手軽なものでおすすめなものとかないでしょうか?

536 名前:510 mailto:sage [2016/02/14(日) 19:18:53.27 ID:ni3s66aP.net]
>>534
良い情報ありがと
自分もこれから見てみることにします。

537 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 22:27:31.27 ID:atofBh+O.net]
https://github.com/uutils/coreutils
これとかどうだろう



538 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 23:39:03.18 ID:+Fbk6tbu.net]
>>537
まさにこんな感じです。ありがとうございます。


linux互換OSがrustで書かれる可能性とかあるんですかね。
所有権が使いこなせれば、メモリリークは絶対起きないんですか?
だとしたらcより堅牢なOSがかける可能性もあるんでしょうか?

539 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 05:33:45.29 ID:W05/xALK.net]
なんでRustは可変長引数に対応しないの?
マクロだと他言語から呼び出せないじゃん。

540 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 09:03:58.07 ID:TrFbduW3.net]
何かスタック壊されそう(適当)

配列をぶちこむとか、他言語側で引数をパースするラッパーを書くとか
想定してる用途がわからんけど

541 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 16:43:37.62 ID:6tNkwA+R.net]
可変長引数をサポートしてるって言語を見れば分かるけど、結局配列を渡してるだけってのがほとんどだよ。
ある意味foo!(v1, v2, v3) => foo(&[v1, v2, v3])みたいなマクロを備えているようなもんだと思う。
他の言語から呼ぶといっても、rust->C->他の言語って感じになるから、Cのstdarg.hに仕様を合わせるのもなあ。合わせたらno_stdじゃ使えなくなるだろうし。
自分には僅かなメリットとしか見えない一方、可変長引数を受け取って別の可変長引数関数に渡すときにどうする?っていう問題が出てくるから、
現状でええやんと思ってしまう。

>>538 RedoxというRustでOSを作るってプロジェクトはあるよ。どれくらい本気なのかは分からない。
あとRobigaliaっていうseL4上にRustで書いたプログラムを動かそう、そういう環境を作ろうというプロジェクトもある。
こっちは本当にできたばっかしなので本気度も展望も無いが。

542 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 22:35:50.35 ID:zmpURjkn.net]
printfみたいな奴なら、Rust側で書式データとポインタ配列(と要素数?)を引数に取れれば良いのでは
他言語側で可変長引数をポインタ配列にするラッパーを噛ませればそれっぽくなる気がする
実用性は知らない

543 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 03:00:30.52 ID:JcT98VoE.net]
impl Trait for Structより
impl Struct by Traitかimpl Struct with Traitのほうが良かった

544 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 07:12:06.10 ID:xwZAj62o.net]
キーワードが増えるのが嫌がられそう

545 名前:デフォルトの名無しさん mailto:sage [2016/02/19(金) 11:22:15.41 ID:lRUD/4+H.net]
未だに box 表現って改変が議論中なのかよ。

546 名前:デフォルトの名無しさん mailto:sage [2016/03/22(火) 10:38:06.53 ID:bLb0KsFB.net]
Android向けのrustコードビルドが通らなくなってて泣いた
rustが悪いんじゃなく Android NDK のビルドツール更新が悪いんだろうけど、もっかい環境作り直すか、、、

547 名前:デフォルトの名無しさん mailto:sage [2016/03/22(火) 13:01:38.89 ID:rMJb+Szz.net]
よくやりがちなんだけど、ttps://users.rust-lang.org/t/newbie-e0499-help-please/5001 みたいに
あるデータを管理するような型、OOPとかで頻出のマネージャークラスをRustでやろうとするとselfを二度貸しすんなって怒られるよね。

↑の例で言うとImageLibの所有権やref mutが必要無いのに要求するImageLib.load_imageが悪いって思いつくまでに結構かかる。



548 名前:デフォルトの名無しさん [2016/03/31(木) 19:12:30.43 ID:G0b7bqcg.net]
Rust ←これ何て読むの?「ルスト」?「ルースト」?「ラスト」?

549 名前:デフォルトの名無しさん mailto:sage [2016/03/31(木) 19:23:00.93 ID:JUFQTQot.net]
ラスト。[rʌst]
[rʌ] はラン run のラ。st はストリート street のスト。

550 名前:デフォルトの名無しさん mailto:sage [2016/03/31(木) 20:07:07.51 ID:G0b7bqcg.net]
d
ラストって読むのか

551 名前:デフォルトの名無しさん [2016/04/15(金) 21:46:53.26 ID:PXsY1g2V.net]
impl<M: Clone + 'static, T: Clone + 'static> expression::Expression<T> for SelectQuery<(T,), LimitOne, M> { }
これのClone + 'staticってどういう意味なのでしょうか?

552 名前:デフォルトの名無しさん mailto:sage [2016/04/16(土) 07:38:20.94 ID:NZYWg9ol.net]
Cloneを実装していて、かつ寿命が'static

553 名前:549 [2016/04/16(土) 21:08:32.91 ID:SpsCGcWk.net]
>>552
ありがとうございます!

554 名前:デフォルトの名無しさん mailto:sage [2016/04/17(日) 06:25:09.22 ID:cLRJyW4r.net]
println!("{0} = 0x{0:X}", val)
みたいなことやりたいんだけどうまい方法ってないですかね
なんか現状だと
println!("{} = 0x{:X}", val, val)
みたいなことするハメになって気持ち悪い

555 名前:デフォルトの名無しさん mailto:sage [2016/04/17(日) 10:58:01.58 ID:fLgoilFs.net]
自分でマクロ書く
その気持ち悪さは人に依るので、自分好みを作った方が早そう

556 名前:デフォルトの名無しさん mailto:sage [2016/04/17(日) 14:05:41.70 ID:VY8v6naW.net]
https://github.com/rust-lang/rust/issues/9456

557 名前:デフォルトの名無しさん mailto:sage [2016/04/17(日) 20:47:19.04 ID:6uoJvpYY.net]
RustでLisp並みにマクロが簡単に作れたら嬉しい。
コンパイル時計算の手段がマクロとunstableなpluginしか無いので特に。



558 名前:デフォルトの名無しさん [2016/04/18(月) 05:41:14.17 ID:poa5Wxih.net]
ライフタイムが理解できない…みなさんどうやって覚えました?

559 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 07:21:50.19 ID:DCvRqpmU.net]
Rust by Exampleを見て理解した気がする

560 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 12:47:52.65 ID:3Lsmx9th.net]
windowsのrustで、現在時刻を取る方法ってある?
timeもclock_gettimeも使えなさそう。
もしや自分でFFIアクセスで書くしかない?

561 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 13:00:31.00 ID:RPQ9NKJO.net]
lifetime parameterが出てくる箇所それぞれで、何を意味してるかを日本語で書いてみるといいよ。
例えば関数定義時のlifetimeだったら
fn foo<'a>(x: &'a T) -> &'a T { .. }
と3箇所で出てくる。
1. <'a> は、関数fooの中で'aというlifetime parameterを使うよ、というコンパイラに対する宣言
2. x: &'a Tは、引数xは、型Tの参照で、この参照の寿命を'aと呼ぶよ、という一種のバインド('a = lifetime(x)みたいな?)
3. -> &'a Tは、関数の戻り値の寿命は2で示したように、xと同じだよ、という誓約。

関数書く側は誓約3を満たすようにコードを書かなきゃいけないし、
関数呼ぶ側は誓約3が守られていることを期待して関数を使う。

562 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 13:05:34.90 ID:RPQ9NKJO.net]
>>560
crates.ioのtimeはwinapiにも依存してるからおそらくクロスプラットホームかと。

563 名前:556 [2016/04/18(月) 22:09:34.70 ID:poa5Wxih.net]
>>559,559
ありがとうございます!
精進します!

564 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 22:31:43.44 ID:U/aSeuNM.net]
全ての&は実は&'a みたいなのを省略しているってのを意識するといいかも

565 名前:デフォルトの名無しさん mailto:sage [2016/04/18(月) 23:57:45.45 ID:IKRsVdN1.net]
>>560
この間のrust1.8でstd::time::SystemTime::nowがstableになったのでUnix時刻が欲しいだけならこれでも良さそう。カレンダーとかタイムゾーンまでやるならcrateのtimeだろうけど。

566 名前:デフォルトの名無しさん mailto:sage [2016/04/19(火) 08:34:44.12 ID:SvHoNoSF.net]
>>562
おぉ、ありがとうー。
まだrust始めたばかりで、cratesまで目がいってなかったわ。

>>565
あざっす。
そっちは使ってみたんだけど、期間計測向き(clockに近いか)だよね。
まさにカレンダー値が欲しかった。

567 名前:デフォルトの名無しさん mailto:sage [2016/04/19(火) 13:59:14.59 ID:SvHoNoSF.net]
>>562
ありがとうー。
time::now()でバッチリだった。



568 名前:デフォルトの名無しさん mailto:sage [2016/04/19(火) 15:31:42.42 ID:ZFbfu4SE.net]
Rustは標準ライブラリを必要最小限にする方針なので必ずチェックする

こことかが纏まってていいかも
https://github.com/kud1ing/awesome-rust/blob/master/README.md

569 名前:デフォルトの名無しさん mailto:sage [2016/04/20(水) 11:12:41.87 ID:XZ847tuS.net]
'あ'.is_alphabetic() => trueなのな。ウィキペディアのアルファベットの項の意味、らしい。
'。'とか'、'といった音にならない文字が非アルファベットで、他の発音する文字は全部アルファベットなのか。
日本じゃアルファベットと言えば[A-Za-z]だけど、他の(非欧米圏の)国では自国の表音文字もアルファベットと呼ぶのが一般的なのか?

570 名前:デフォルトの名無しさん mailto:sage [2016/04/20(水) 15:31:46.87 ID:h2QcRVy8.net]
alphabetは単に「表音文字」「基本的な構成要素」って意味だからな
[A-Za-z]はラテン字(Latin alphabet)、あるいはローマ字(Roman alphabet)

571 名前:デフォルトの名無しさん mailto:sage [2016/04/20(水) 21:12:18.40 ID:pIEmO+zY.net]
アルファベットって言葉も多義的だもんな。有限個の文字集合って意味の時もあるし。

572 名前:デフォルトの名無しさん mailto:sage [2016/04/22(金) 11:34:13.71 ID:vkMfBoHo.net]
逆に[A-Za-z]だけを判定したいときの関数ってビルトインじゃないの?
それ不便じゃない

573 名前:デフォルトの名無しさん mailto:sage [2016/04/22(金) 12:52:30.32 ID:UQ/RDeWl.net]
is_alphabeticとstd::ascii::AsciiExt::is_asciiで判別可能。
fn is_abc(c: char) -> bool { c.is_alphabetic() && c.is_ascii() }
もっと簡単にmatch c with { 'a' ... 'z' | 'A' ... 'Z' => { } } とすると応用も効いて楽。

574 名前:デフォルトの名無しさん [2016/04/25(月) 21:51:50.82 ID:ZO17CzTB.net]
b"mysql"
この「b」って関数(?)どうやって定義するんですか?

575 名前:デフォルトの名無しさん mailto:sage [2016/04/25(月) 22:21:04.08 ID:J5O1W2lq.net]
それリテラルでしょ。
Rust にユーザー定義リテラルは無かったと思うけど。

576 名前:572 [2016/04/25(月) 22:27:29.58 ID:ZO17CzTB.net]
>>575
ありがとうございます!
無いんですね…残念…

577 名前:デフォルトの名無しさん mailto:sage [2016/04/25(月) 22:32:56.21 ID:J5O1W2lq.net]
ユーザー定義リテラルは C++ の仕事だね。



578 名前:デフォルトの名無しさん mailto:sage [2016/04/25(月) 23:07:48.87 ID:1QTyW0zP.net]
Rustならマクロでなんとかすべきかな

579 名前:デフォルトの名無しさん mailto:sage [2016/04/26(火) 10:53:24.23 ID:W7yJO6It.net]
なんでセミコロンが必要なんですか

580 名前:デフォルトの名無しさん mailto:sage [2016/04/26(火) 14:06:23.04 ID:XWVUSc0/.net]
>>579 ";"を付けて、この式の値は使わない(unit型)だとプログラマが明示してやると色々便利だから。
";"の有無でその式の値を返す(使う)かどうかをreturnを使わずに指定できる。
もしreturn文が必須ということになると、{}で一連の処理をブロック化して書くときにも"return 値"が必須になって、エラーのため大域脱出したいときに困る。

というのが建前。Algol系列で演算子のユーザー定義ができない文法だから、省略してもいいような箇所、例えばlet文の末尾とかあるとは思う。
元々OCamlで開発されてたせいで、MLの香りが随所に残っているという歴史的経緯と、
構文解析しやすいっていう本音と、先々の拡張に今のコードが耐えうる形にしたいのでは、という推測がある。

581 名前:デフォルトの名無しさん mailto:sage [2016/04/26(火) 14:16:05.00 ID:gziRJOQu.net]
個人的邪推が強いなw
公式サイトとQAにあるから、その通りに解釈しとけば幸せ

582 名前:デフォルトの名無しさん mailto:sage [2016/04/26(火) 20:04:42.44 ID:ORQVNS3H.net]
if a > b {a} else {b}; // これより
if a > b then a else b end # これがいい
if a > b then a else b (* これがさらにいい *)

583 名前:デフォルトの名無しさん mailto:sage [2016/04/26(火) 22:47:31.69 ID:gziRJOQu.net]
どの言語のことか分からんが、それなら三項演算子でいいんじゃね
省略を美徳と見るならthenとかelseはウザイわ

rustの;や{}は別の観点を美徳としてると解釈してる
万人が好む美徳とは思ってないけど

584 名前:デフォルトの名無しさん mailto:sage [2016/04/26(火) 23:29:34.25 ID:XWVUSc0/.net]
1. Rust
2. Ruby
3. OCaml
Rustは型注釈もML系からもっと輸入すべきだったと思う。
fn foo<T, U>(x: T) -> U より、fn foo: 'T -> 'Uとか fn foo:: T, U => T->Uとかの方が見やすい。
lifetime parameterをどう書くかを考慮する必要はあるけど、
型注釈と変数が一緒になってるより良いと思う。

585 名前:デフォルトの名無しさん mailto:sage [2016/04/27(水) 00:10:16.86 ID:HJXKmY0b.net]
そこまでML文法好きならML言語のコンパイラ強化を推進してはどうか
俺はC++やJavaライクで今の文法の方が分かりやすいぞ

586 名前:デフォルトの名無しさん mailto:sage [2016/04/27(水) 00:58:25.51 ID:KaqBk466.net]
Rustの名前の由来は錆ではなくサビキン(錆菌)という噂を聞いた

587 名前:デフォルトの名無しさん mailto:sage [2016/04/28(木) 21:19:35.52 ID:nQ0T9aCz.net]
rust使ってる人って何作ってるの?
ブラウザ以外で。

golangはWebAPIサーバ コマンドラインアプリ
swiftはiosアプリ
kotlinはandroid
ってすみ分けができてるけどrustの得意分野はどこ?
OS?



588 名前:デフォルトの名無しさん mailto:sage [2016/04/28(木) 22:13:38.50 ID:oaLnAHx1.net]
RustでOS作ってるしエディタも作ってるのを見つけた
Rustは単純にC++の代替でしょ

589 名前:デフォルトの名無しさん mailto:sage [2016/04/28(木) 22:16:41.12 ID:Q0S16tI3.net]
コアなライブラリ作るのに適してる
UIやスレッド持つレイヤーまで上がるなら他言語の方が取り回し良いと思う

590 名前:デフォルトの名無しさん mailto:sage [2016/04/29(金) 00:02:47.40 ID:NuB51tNS.net]
今までc/c++で作っていた分野の、特に並列性のあるプログラムの置き換えに適している、と思う。
ゼロコスト原則と、言語レベルでの並列性サポートが強力、と思う。

591 名前:デフォルトの名無しさん mailto:sage [2016/04/29(金) 01:42:14.94 ID:Ew5+6UlM.net]
crates.io見る限りだと、フレームワークの更に下の部分作ってる人が多いイメージ

592 名前:デフォルトの名無しさん mailto:sage [2016/04/29(金) 06:58:13.04 ID:KOzpN5av.net]
>>590
並列性は安全ではあるが性能を考慮してるようには見えないがなぁ
goが並列性を強化してるは理解出来るが、rustは並列でも安全だけど性能は従来同等かそれ以下?
ゼロコストを気にする性能を求めるならマルチスレッドプログラミングは他レイヤーに任せた方が良さそう

593 名前:デフォルトの名無しさん [2016/04/29(金) 13:41:09.09 ID:7UhRF0XY.net]
MacでCargoを使ってLinux用のバイナリを作成したいのですが、どうやればできますか?

594 名前:デフォルトの名無しさん mailto:sage [2016/04/29(金) 15:01:33.90 ID:JX6DmXiZ.net]
>>593
Linuxバイナリ(elfフォーマット?)を吐くクロスコンパイルのためのgccを用意し、
rustcのコマンドラインオプションでリンカとしてgcc渡せばいけるらしい

適当にググって見つかった記事

解説記事(英語)
https://github.com/japaric/rust-cross/blob/master/README.md#cross-compiling-with-rustc

日本語記事
qiita.com/yasuyuky/items/7849931d4924864e40b3
ARMバイナリの説明っぽいけど、上の記事から同様にできそう

595 名前:デフォルトの名無しさん mailto:sage [2016/04/29(金) 20:53:52.02 ID:NuB51tNS.net]
>>592
他のレイヤーって、どんな選択肢があるの?

goとrustの目標は同じようなものじゃないかな、と思う。
現状の結果も似たようなもんに見えるし。
いや、厳密に比較した訳じゃないけどね…

596 名前:デフォルトの名無しさん mailto:sage [2016/04/29(金) 21:40:02.52 ID:6d5pj9gK.net]
rustはGCもないしgoよりもっと機械より
リアルタイム性が必要なところではrustに分がありそう

597 名前:591 [2016/04/29(金) 21:57:03.71 ID:7UhRF0XY.net]
>>594
ありがとうございます!試してみます!



598 名前:デフォルトの名無しさん mailto:sage [2016/04/30(土) 06:49:30.08 ID:RNVquJmq.net]
>>592
まあ、注意して書けばC++と同等のパフォーマンスが出る、というのが実際のところでしょう
Rust特有のオーバーヘッドとかは無いですし

599 名前:デフォルトの名無しさん mailto:sage [2016/04/30(土) 08:27:27.63 ID:NXU0px5d.net]
>>597
rustup使うとクロスコンパイル用のターゲット追加も簡単にできるらしい

600 名前:デフォルトの名無しさん [2016/04/30(土) 14:34:10.03 ID:Q97tfhpp.net]
>>591
まだ若い言語だし、学習コストも高目だからかねー。

601 名前:595 [2016/04/30(土) 14:48:55.99 ID:hZlPwcrG.net]
>>599
rustup試してみましたが以下のエラーが出てビルドできませんでした。

$ cargo build --target x86_64-unknown-linux-gnu
Compiling philosopher v0.1.0 (file:///Users/hoge/rust/philosopher)
error: linking with `cc` failed: exit code: 1
note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L"...(長すぎて書き込めないので省略)
note: clang: warning: argument unused during compilation: '-pie'
ld: unknown option: --as-needed
clang: error: linker command failed with exit code 1 (use -v to see invocation)

error: aborting due to previous error

602 名前:デフォルトの名無しさん mailto:sage [2016/04/30(土) 20:19:13.61 ID:nmBsk/Cs.net]
>>601
unknown optionで落ちてるから、clangのバージョンの問題じゃない?
なんとなく

603 名前:599 [2016/04/30(土) 23:06:42.19 ID:QU2PhAJ9.net]
>>602
一応新しいバージョンを使っているはずなのですが…
$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.29)

ちなみにbrewでgccをインストールしてcargoのリンカをそれに設定してもダメでした…

604 名前:デフォルトの名無しさん [2016/05/01(日) 00:09:25.06 ID:C8GC+yTl.net]
JavaですらC++の二十倍速いのに同等ってことは無いだろう。

605 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 14:02:22.00 ID:vpP9ivFq.net]
VMとネイティブだよ?
C++のライブラリのどっかの出来が悪くて遅いみたいな話かな

「Java 20倍 C++」とかで検索するとJavaがCの10〜20倍遅いって記述しか見当たらん

606 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 14:07:31.13 ID:g2gZsLck.net]
多くのJava VMはC++で出来てるんだからC++より速くはならんだろ
と思ったが、スレッドプールを事前に用意&スレッドオブジェクト解放をGCに任せて遅延させるなどで、それらを計測時間に含めないなら速く見えるか

その辺加味してもrustはどうだろうね
ライフサイクルに合わせてスレッドオブジェクト生成、解放してるなら高々同等になりそうなものだが

607 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 14:17:07.11 ID:vpP9ivFq.net]
LLVMでネイティブコンパイルされるんだから、言語よりライブラリの問題だな
それこそRustは低レベルプログラミングが出来る訳だし



608 名前:デフォルトの名無しさん [2016/05/01(日) 17:13:53.64 ID:tKi6j9CT.net]
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1p

609 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 19:42:13.84 ID:vpP9ivFq.net]
その人を困らせようと思っているのでない限り、>>608の行動は間違っている

610 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 19:53:36.50 ID:5f/j1Sd0.net]
まあ悪意でやってるんだろう。

611 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 20:15:56.60 ID:jOtWeASF.net]
D言語スレにもあったぞこれ

612 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 21:08:10.75 ID:az/VnHmm.net]
Rustはこれからまだ速くなるってブログで言ってたな
正直構文は好きになれないけどそういうのと流行る言語とは別問題だからね
Rustは流行りそうな言語だと思う

613 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 22:34:37.32 ID:VrD9Va1p.net]
goくらい学習コストが低くなってくれればなぁ。
優秀な学習サイトの登場がまたれる

614 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 01:07:08.17 ID:s3SZ5Nw7.net]
>>613
英語サイトなら、Rust By Exampleが有名かと

615 名前:デフォルトの名無しさん [2016/05/02(月) 02:01:04.83 ID:l0p8tzKw.net]
所有権と参照のlifetimeという概念がある限り学習コストは低くならないと思う
型システムも代数的データ型と型クラスというmlライクなものだし
それを取っ払ったらRustじゃないから難しいところ

616 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 09:48:33.22 ID:kvSwD3Xt.net]
一通りRustの本読んで、何か適当な物を作ってみて、けど未だにコンパイラにmay not live long enoughとか怒られるコードを書いてます。
このエラーを解決するのにunsafeを使うべきか、設計を変えるべきか、判断に悩むこと多数。

617 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 10:27:45.33 ID:LI15fDaU.net]
unsafeでどう解決するんだ



618 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 10:41:04.80 ID:J8a4Z9kC.net]
unsafeは分かってる人だけが使うべき
cloneとかmem::swapとか使ってみたら

619 名前:デフォルトの名無しさん [2016/05/02(月) 11:03:12.78 ID:JUQEx8eE.net]
unsafeはポインタの参照外しとunsafe関数を呼べるだけだからコンパイル通らないものがコンパイル通ったりするわけじゃないぞ

620 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 13:22:45.55 ID:bzpdhBbq.net]
unsafeでコンパイルは通るけど、不正アクセスで落ちうるプログラムじゃないの?
一応、コンパイルは通るようになりそうだけど安全じゃなさそう

折角コンパイラが指摘してくれてるんだから設計を直すべきだろうよ

621 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 13:48:16.52 ID:kvSwD3Xt.net]
通せるんだよなあ。https://play.rust-lang.org/?gist=ea6fa9205bdc09ecbc1d730cddd5ae9a&version=nightly&backtrace=0
Vecとかコンテナみたいな型を作るときはRaw Pointerじゃないと使い勝手が悪くなることがしばしばあって、
自分の作った型はどうだろうか、unsafe使った方が綺麗に書けるんじゃないかとmay not live long enoughエラーに出くわしたときに考えちゃう。

622 名前:デフォルトの名無しさん [2016/05/02(月) 14:00:04.69 ID:xGYQ4Typ.net]
unsafe関数呼んどるやん?

623 名前:デフォルトの名無しさん [2016/05/02(月) 14:05:04.32 ID:xGYQ4Typ.net]
なるべくならRustが提供しているポインタ型を使って解決したほうがいいかと

624 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 16:06:39.61 ID:kvSwD3Xt.net]
>>622 すまん、>>621はコンパイル通らないものもunsafe使えば通るぞ、という>>617>>619へのレスだ。

625 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 17:37:54.86 ID:J8a4Z9kC.net]
unsafeすればborrow checker先生も黙ってくれるからな
borrow checkerが何をしてるか理解してる人だけがunsafe使うべきだとは思うけど

626 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 18:33:23.74 ID:51E+NX7H.net]
unsafe 使うくらいなら c/c++ 使った方がいいと思うの。

627 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 19:05:17.35 ID:tVjMjJs/.net]
ああ、そりゃデータ型書くときはunsafe使わないとな
Borrow checkerを黙らせる為に使うのは間違いで、メモリを手動管理するために使うものだ

>>626
unsafe部分だけちゃんとテストしておけば
それをビルディングブロックに安全なプログラムを書ける



628 名前:デフォルトの名無しさん mailto:sage [2016/05/02(月) 20:08:28.03 ID:bzpdhBbq.net]
Cの関数と連携する場合はunsafeは使わないとにっちもさっちもいかん時がある
流石にプリミティブ型だけじゃゼロコスト(笑)なデータ取り扱いになるぜよ

それ以外のPure Rustで使わないと組めないケースあるっけ?

629 名前:デフォルトの名無しさん mailto:sage [2016/05/03(火) 01:16:03.38 ID:/NLSYk13.net]
swap

630 名前:デフォルトの名無しさん [2016/05/03(火) 18:25:56.19 ID:IH0qUzZ3.net]
rustupとmultirust、どっち使えばいいですか?

631 名前:デフォルトの名無しさん mailto:sage [2016/05/03(火) 20:59:04.01 ID:ZIxVRgvx.net]
multirustの後継がrustupだし今から使うならrustupで良いと思う
機能面でもクロスコンパイル対応とかあって優位だし

632 名前:デフォルトの名無しさん mailto:sage [2016/05/03(火) 21:24:11.15 ID:S8jXYqZo.net]
後継っつーか、公式が改めてrustup作ったのか
multirust使ってたけど乗り換えるか、、、

633 名前:628 [2016/05/03(火) 23:23:53.50 ID:IH0qUzZ3.net]
>>631, 630
ありがとうございます!rustup使います!

634 名前:デフォルトの名無しさん [2016/05/03(火) 23:46:51.91 ID:IH0qUzZ3.net]
https://github.com/rust-lang-nursery/rustup.rs
これって何者ですか?
公式のrustupとは違うみたいですが…

635 名前:デフォルトの名無しさん mailto:sage [2016/05/04(水) 03:05:09.99 ID:4aQWfg60.net]
cargo install ドメインの名前解決に失敗して死ぬな

636 名前:デフォルトの名無しさん mailto:sage [2016/05/04(水) 08:29:40.07 ID:FvummhsT.net]
>>634
公式のrustupの後継
シェルスクリプトをRustで書き直したもの

637 名前:632 [2016/05/04(水) 20:45:56.67 ID:bY+rnU0s.net]
>>636
そうなんですね!ありがとうございます!



638 名前:デフォルトの名無しさん mailto:sage [2016/05/08(日) 17:53:19.98 ID:NKVAXp+L.net]
カニ本だそうで。
shop.oreilly.com/product/0636920040385.do

639 名前:デフォルトの名無しさん mailto:sage [2016/05/09(月) 17:24:59.65 ID:fW/7hyIs.net]
rubyベストプラクティスもカニじゃなかった?

640 名前:デフォルトの名無しさん [2016/05/15(日) 19:58:09.87 ID:K33PvDY8.net]
今年中に2.0出るのかな?

641 名前:デフォルトの名無しさん mailto:sage [2016/05/16(月) 00:59:11.32 ID:hYcI5Sh2.net]
Rust、SemVerに準拠してるし、後方互換性をがっつり崩すような変更がない限り、1.x.yのままなんじゃない?

642 名前:デフォルトの名無しさん mailto:sage [2016/05/16(月) 02:54:51.79 ID:TWeJeTmL.net]
今日で1周年か

643 名前:デフォルトの名無しさん [2016/05/16(月) 13:25:33.90 ID:khc6QXJf.net]
Rustってオーバーロードないの?

644 名前:デフォルトの名無しさん mailto:sage [2016/05/16(月) 13:40:14.34 ID:3yHJ0Kd5.net]
どういうオーバーロードかによる

例えば
fn push<P: AsRef<Path>>(&mut self, path: P)

impl AsRef<Path> for Path
impl AsRef<Path> for OsStr
impl<'a> AsRef<Path> for Cow<'a, OsStr>
impl AsRef<Path> for OsString
impl AsRef<Path> for str
impl AsRef<Path> for String
impl AsRef<Path> for PathBuf

645 名前:641 [2016/05/16(月) 14:29:24.99 ID:khc6QXJf.net]
fn push(a: u8)
fn push(a: u8, u32)
みたいにやりたかったです

646 名前:デフォルトの名無しさん mailto:sage [2016/05/16(月) 14:45:17.97 ID:4v1q9uFB.net]
関数に関しては無い。型推論が面倒になるからだと思う。
メソッドに関してはある。traitとstruct(とenum)のimplで同名のメソッドを定義したらstruct優先。
2つ以上の異なるtraitが同名のメソッドを定義してて、2つともimplした型の場合はUFCで書かないとエラーになる。

647 名前:デフォルトの名無しさん mailto:sage [2016/05/16(月) 15:21:22.82 ID:LQrSqnuf.net]
>>643
オペレータのオーバーロードならある。
use std::ops::Add;
struct A {}
impl Add<i32> for A {
type Output = i32;
fn add(self, rhs: i32) -> i32 {rhs}
}
impl Add<f32> for A {
type Output = f32;
fn add(self, rhs: f32) -> f32 {rhs}
}



648 名前:デフォルトの名無しさん mailto:sage [2016/05/18(水) 07:21:57.85 ID:zi3YbWFS.net]
面倒だけどタプルに対してやってみるのは?
trait Push {
fn push(&mut self);
}

impl Push for (u8,) {
fn push(&mut self) { ... }
}

impl Push for (u8, u32) {
fn push(&mut self) { ... }
}

fn main() {
(0u8,).push();
(1u8, 2u32).push();
}

649 名前:デフォルトの名無しさん mailto:sage [2016/05/18(水) 12:53:24.93 ID:83U9cWax.net]
>>648
変態!

650 名前:デフォルトの名無しさん mailto:sage [2016/05/18(水) 15:50:42.49 ID:4NyJw2NY.net]
trait Push {
fn push(self, c: Container)
}

impl Push for u8
impl Push for (u8, u8)

container.push(1)
container.push((1, 2))

651 名前:デフォルトの名無しさん mailto:sage [2016/05/18(水) 16:36:29.40 ID:g+vOVBq1.net]
>>648
それオーバーロードでもなんでもなくね?

652 名前:デフォルトの名無しさん mailto:sage [2016/05/18(水) 20:51:59.07 ID:pvzqVuHQ.net]
>>651
でも同じもの表現してない?

653 名前:デフォルトの名無しさん mailto:sage [2016/05/19(木) 01:39:05.88 ID:yE0vr9/W.net]
何かこのイカれたブログを思い出した。zero-overheadでheterogeneousなリストを作る話。
nercury.github.io/rust/interesting/2015/12/12/typed-arrays.html

654 名前:デフォルトの名無しさん [2016/05/30(月) 22:31:42.67 ID:FMy0/Tvb.net]
2番め以降の変数の型が違うオーバーロード書けないのね…

655 名前:デフォルトの名無しさん [2016/06/01(水) 22:24:24.45 ID:JHsrsE//.net]
オーバーロードが追加されることって絶対ないのかな?
めちゃくちゃRust使いたいんだけどこれがないせいで使えない。

656 名前:デフォルトの名無しさん [2016/06/01(水) 22:49:23.73 ID:JHsrsE//.net]
trait Sql {
fn filter<T>(&self, value: T);
}

impl Sql for i32 {
fn filter(&self, value: i32) {

}
}

impl Sql for String {
fn filter(&self, value: String) {

}
}
みたいなことやりたいのですがエラーになってしまいます。
どうにかできないものでしょうか。

657 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 23:39:18.93 ID:OaTzWyfO.net]
>>656 引数の数が違ったら面倒だけど、この程度だったらtraitを多相にすればいいよ
https://play.rust-lang.org/?gist=63404b280103d3da07c6d08910acda25&version=stable&backtrace=0
多相と同じ表現力のassociated typeでもいける。
https://play.rust-lang.org/?gist=fce8146e69f7cdd16b582a4c4ce37673&version=stable&backtrace=0



658 名前:654 [2016/06/02(木) 10:39:12.76 ID:LfrYVCEY.net]
>>657
ありがとうございます!
これでいけるか試してみます!

659 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 20:34:44.12 ID:9cIQ9Ton.net]
rustのsubredditにゲームの方のRustの投稿がちょくちょく来てたがホッケー選手まで出てくるとは思わなんだ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<171KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef