[過去ログ] Rust part16 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
834
(1): 2022/09/27(火)08:15 ID:SBVoZTui(1) AAS
AMD64のデフォルトのオペランドサイズは32bitなのにusizeが64bitなのは何でなのかな
835: 2022/09/27(火)11:05 ID:OwORQ6vn(2/2) AAS
size_tが64bitだからでは
836: はちみつ餃子 ◆8X2XSCHEME 2022/09/27(火)12:28 ID:ozjafOA0(1) AAS
>>834
usize はポインタのサイズということになっている。
837: 2022/09/27(火)19:04 ID:ZwmfNOl5(1) AAS
>>831
単体テストで、依存を分離するのは当然のことすぎてみんな説明が億劫になってる
C++だろうがRubyだろうが、モックやスタブを使って、関数同士やクラス同士の依存を切り分けてテストするのは当たり前
そうしないとそもそも単体テストにならないじゃん

わかってる人にしかわからないであろう簡略な説明をすると、テスト用のエントリポイントで、テストに使うモックオブジェクトを指定するだけだよ
そういうことができるようにあらかじめコード設計しておかないといけないがな
考えてなかったならリファクタが必要
838: 2022/09/27(火)19:48 ID:J8MleXan(1) AAS
そんなフワフワした説明されても...
839
(1): 2022/09/27(火)19:51 ID:AWnlNGZp(1) AAS
本物と異なり決まった値を返す送信元スタブと
本物と異なりassertだけする送信先モックを
mod testsの中では本物の代わりにuseするだけだよね
入れ替えちゃうからtrait制約で本物も偽物も受け付け対応とかわざわざする必要ないよね
840: 2022/09/28(水)00:44 ID:JQpGo85s(1/2) AAS
>>839
useしたモックをどうやって注入すんの
関数の引数もstatic変数でも良いけど、テスト対象の実装がモックも本物も選択的に使えるようにするならば、
genericな型を受け付けるような実装にしておかないといけないのでtraitが登場するのでは

それともmod testsの外もcfgで置き換えると言っている?
841: 2022/09/28(水)00:48 ID:JQpGo85s(2/2) AAS
要は
use imp::Foo;
fn target(foo: Foo) {}
がテスト対象だとして
mod tests {
use mock::Foo;
#[test]
fn test() {
target(Foo::new());
}
省3
842
(1): 2022/09/28(水)07:20 ID:1i04Jlqk(1) AAS
traitが無い言語では無理ってこと??
843: 2022/09/28(水)11:35 ID:RLf9Yg7w(1) AAS
>>842
他の言語は他のやり方でやってるだけだろ
844
(1): 2022/09/29(木)01:43 ID:xXycU9Ev(1) AAS
u32 を格納する型が必要になり、また、逆に u32 に変換する必要もあるという状況で
せっかくだから u32 に変換可能な型は受け入れようと考えてこんなコードを書きました。
しかしエラーになります。

struct Code(u32);

impl<T: Into<u32>> From<T> for Code {
fn from(x: T) -> Self {
Code(x.into())
}
}

impl From<Code> for u32 {
省10
845: 2022/09/29(木)02:16 ID:zId7dOnm(1) AAS
無い
846: 2022/09/29(木)02:20 ID:7xp1eqla(1) AAS
そっかー
847: 2022/09/29(木)02:40 ID:U5dWXlr2(1) AAS
そういうのはIntoCodeみたいな感じで別トレイトにすることが多い気がする
外部リンク[html]:docs.rs
848: 2022/09/30(金)02:17 ID:Yj/X+hjS(1) AAS
初歩的なことですまんけどさ
メソッド内で↓みたいなのってよく見るけど、こう言うのってself.asdfのまま使用するのに比べてどういった利点があるの?
let asdf = self.asdf;
849: 2022/09/30(金)10:23 ID:1sTGpNyR(1) AAS
名前を短くする目的が99パー
850: 2022/09/30(金)11:00 ID:tNhbOFxw(1) AAS
クロージャーで構造体のフィールドにアクセスすると構造体ごとムーブしちゃうんでそれ対策じゃないかな
2021で対策されたからどんどん減ってくだろうけど
外部リンク:play.rust-lang.org
851
(3): 2022/09/30(金)12:43 ID:NYKsqXq4(1/2) AAS
書き方は違うけどフィールドそれぞれに対して処理を行う場合に抜け漏れがないことをコンパイラにチェックさせる目的でローカル変数にすることはある

let Foo { foo, bar. baz } = self;
としておくと後続の処理で使わないフィールドがあったときにコンパイラが警告してくれる
構造体に新たにフィールド追加した場合も分割代入の箇所でコンパイルエラーになるので修正必要箇所を洗い出すことができる
852: 2022/09/30(金)13:52 ID:yzoXDHK/(1) AAS
>>851
なんかすごくモヤモヤする
853: 2022/09/30(金)14:15 ID:oHn8O8ll(1) AAS
本人は俺ってスゲー、天才やん!
って思ってるんだろうけど後でコード見たらなんでこんなイミフなことしてるんだ?バカじゃねーの
ってなるパターンかと
まあこういう工夫をすること自体は悪くない
854: 2022/09/30(金)14:42 ID:M1og6e+j(1) AAS
フィールドそれぞれに処理をするシチュエーションがわからない
855: 2022/09/30(金)14:50 ID:temvUu5a(1) AAS
>>851
俺もそのdestructuring assignment自体は使いまくる
しかし目的が漏れチェックとは違うのでこうだな
let Self { foo, bar, .. } = self;
856: 2022/09/30(金)14:55 ID:t/wNXSJY(1) AAS
>>851
これいいな
857: 2022/09/30(金)15:59 ID:XmkFmofe(1) AAS
こうやって自己満足の意味不明なコードが量産されていく
858: 2022/09/30(金)16:19 ID:GH/ZHf2N(1) AAS
全フィールド舐めるのが重要な処理ってシリアライズとかだろうか
そんな小手先のテクニックとかじゃなくてproc_macro組んだ方がいいと思う

シリアライズしたいだけならserde使って#[derive(Serialize)]
これも結局proc_macroだわな
859: 2022/09/30(金)17:36 ID:NYKsqXq4(2/2) AAS
コマンドライン引数や設定ファイルの定義をclap::Argやserde::Deserializeで宣言的にやって、
それらを処理するところで分割代入してローカル変数にして処理してる
人間が意識的に気をつける必要がある箇所を極力減らしたい気持ちでやっている

好き嫌いあるかも知れないけど趣味プロダクトだしコーディングの意図をコメントに残してるから許せ
860: 2022/10/01(土)02:29 ID:hYwRxeDD(1) AAS
>>844
impl<T: Into<u32>> From<T> for Code {}の定義はFromの反射性と衝突するから間違ってる。
Into<u32>を受け付けたいなら関数のパラメタの型をT: Into<u32> or impl Into<u32>にすればいい。
まあ、実装上の規約として必要なんで内部ではtrait IntoFooはパターンとして使われるけど外に漏らすようなものでもない。
861: 2022/10/01(土)02:38 ID:6voBA5Ft(1) AAS
&(T, U)と(&T, &U)って等価ですか?
862: 2022/10/01(土)05:47 ID:6w1pI6Co(1) AAS
等価ではありません
863: 2022/10/01(土)19:20 ID:LqnhFBhC(1) AAS
アドレスを考えれば明白に別物
一方で
let t = (123, "abc");
let (x, y) = &t;
と自動マッチングしてくれて
&t の型は &(i32, &str)
x の型は &i32
y の型は &&str
となる
つまり&(T, U)が(&T, &U)に分割代入される
1-
あと 139 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.018s