Rust part33 (229レス)
Rust part33 http://mevius.5ch.net/test/read.cgi/tech/1755247770/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
47: デフォルトの名無しさん [sage] 2025/08/24(日) 12:08:19.32 ID:veJK4T2Q 返却された値がスタック上でどう扱われるかというのは言語仕様でなく最適化の問題だから、そこはRustではなくLLVMの話 言語仕様としては「Rustではタプルを簡単に作れる」「タプルの中身を別々の変数に束縛できる」というだけ 多値返却の目的からすればこれで十分だし、多くの言語はこれに相当する Goは本当に多値返却という仕様で、これはタプルを返すのとは違う そもそもタプルが言語仕様になくて、関数の返り値でだけ多値を返せるという変わった仕様 だから、2つの戻
り値を返す関数を1変数で受け取ることができなかったりする (Rustでいえば「戻り値を分解せず1つのタプル変数 t で受け取る -> t.0, t.1 のようにアクセスする」という書き方がGoではできない) だから言語仕様としての話をしたいのか、「関数から複数の戻り値を返す」という目的の話をしたいのかで話は変わる 後者については、最近の多くの言語ではサポートしてるし、そんなに話がズレることもない 前者の意味でなら、Rustは多値返却の構文を持つ言語とは違う http://mevius.5ch.net/test/read.cgi/tech/1755247770/47
48: デフォルトの名無しさん [sage] 2025/08/24(日) 12:16:23.06 ID:aQdKZ7zp Goの多値とRustのタプルは同じ どちらも実装は多値として返すため多値レジスタ返しが可能ならばそうするため効率が最も優れている 関数定義もほぼ同じ func foo() (type1, type2) {… fn foo() -> (type1, type2) {… http://mevius.5ch.net/test/read.cgi/tech/1755247770/48
49: デフォルトの名無しさん [sage] 2025/08/24(日) 12:16:31.50 ID:tCu5AZNy バカなやつほど抽象度の区別ができない バカなやつほどオレオレ定義で用語を使う バカなやつほど主語を書かない 本当に相手にする価値があるか考えよう 改善の見込みがないバカなら何を書いても時間の無駄でしかない http://mevius.5ch.net/test/read.cgi/tech/1755247770/49
50: デフォルトの名無しさん [sage] 2025/08/24(日) 12:26:32.12 ID:95hjiUrq 多値を抽象化して機能を強化したものがタプルだもんね だから多値でできることは全てタプルでもできるんだよ タプルを持つ言語は機能の低い多値を別途持つ必要がない http://mevius.5ch.net/test/read.cgi/tech/1755247770/50
51: デフォルトの名無しさん [sage] 2025/08/24(日) 12:50:55.19 ID:veJK4T2Q 「タプルがあれば十分」は殆どのケースでは同意するけど、Goに限ってはそうする理由があるんだよ エラーを多値で返す仕様かつ、エラー処理を明示的に書かせる思想の言語だから value, err := foo() のように err がコード上に表れるようにする必要があって、これはタプルだとまずい t := foo() と書けてしまうと「タプルの2要素目がエラー」というのが見えなくなる これは割とGo特有の事情で、Result型や例外を使う言語だとタプルでも困らない 言語仕様というのは他の部
分も含めた全体的なデザインとして考えるものだから、「Rustではタプルで困らない」が正しくても、他の言語含めて全てそうだとは言えない http://mevius.5ch.net/test/read.cgi/tech/1755247770/51
52: デフォルトの名無しさん [sage] 2025/08/24(日) 12:56:30.01 ID:9a3ehhoR >>49 >バカなやつほど抽象度の区別ができない >バカなやつほどオレオレ定義で用語を使う >バカなやつほど主語を書かない 汚コーダーの特徴が濃縮されてるね 3番目は「書かない」というより「書けない」だと思う http://mevius.5ch.net/test/read.cgi/tech/1755247770/52
53: デフォルトの名無しさん [sage] 2025/08/24(日) 13:02:12.19 ID:LAWD3p/v 原始的な剥き出しの多値を扱う必要のない言語においては、タプル多値があれば多値をサポートしているという結論でいいんじゃないかな http://mevius.5ch.net/test/read.cgi/tech/1755247770/53
54: デフォルトの名無しさん [sage] 2025/08/24(日) 13:07:02.23 ID:vekMbO+E Rustはnamed tupleもanonymous structもなくunnamed tupleで位置でアクセスするか事前に定義した型で名前でアクセスするかしかないから利便性ではモダンな他言語に一段劣る http://mevius.5ch.net/test/read.cgi/tech/1755247770/54
55: デフォルトの名無しさん [sage] 2025/08/24(日) 13:18:17.18 ID:kBf9AmUd >>54 これ便利だと思う? # まずnamedtuple関数をインポートします from collections import namedtuple # 次にNamed Tupleを定義します Point = namedtuple('Point', ['x', 'y']) # そしてインスタンスを作ります p = Point(10, 20) # 名前でアクセスできるようになります print(p.x) # Output: 10 print(p.y) # Output: 20 http://mevius.5ch.net/test/read.cgi/tech/1755247770/55
56: デフォルトの名無しさん [sage] 2025/08/24(日) 13:28:22.18 ID:fUN48E4b >>51 いや、エラーに限らずt.0とか普通に可読性最悪だからね 多値をタプルとして実装するなら、即時の分割代入を必須とするか、もしくはC#のようにpositionalなタプルと互換性のあるnamed tupleとするか、どちらかは必須 http://mevius.5ch.net/test/read.cgi/tech/1755247770/56
57: デフォルトの名無しさん [sage] 2025/08/24(日) 13:41:09.97 ID:uDNIRrgr 必要となるまでは1つのまとまりとして一括して扱えたほうが有利 必要になったところでパターンマッチングさせて個別に用いる http://mevius.5ch.net/test/read.cgi/tech/1755247770/57
58: デフォルトの名無しさん [sage] 2025/08/24(日) 13:49:22.14 ID:+tDfyqBW Rustは必要なところではパターンマッチングできるから不便なことはないよな http://mevius.5ch.net/test/read.cgi/tech/1755247770/58
59: デフォルトの名無しさん [sage] 2025/08/24(日) 13:56:11.80 ID:fUN48E4b 取得から消費までのコード上の距離が離れるほど人間の短期記憶の負担になり可読性が低下する 複おじは特に頭悪いから実感してるんじゃない? http://mevius.5ch.net/test/read.cgi/tech/1755247770/59
60: デフォルトの名無しさん [sage] 2025/08/24(日) 14:11:41.28 ID:0UxuBUhy let (unko, chinko) = unkochinko とか突然出てきてunkochinkoの宣言が離れてたら、合ってるのか不安を感じてつい宣言までスクロールしちゃうわ 離れた場所での位置依存は普通に可読性最悪 http://mevius.5ch.net/test/read.cgi/tech/1755247770/60
61: デフォルトの名無しさん [sage] 2025/08/24(日) 14:14:05.68 ID:ieA/MpG4 >>56 ジェネリックに意味を持たない局面もあるからそこでt.0を使うのは適してる 意味がある局面なら例えばfor (index, name) in ...や|(index, name)| ...のように使われるから名前でアクセスできる http://mevius.5ch.net/test/read.cgi/tech/1755247770/61
62: デフォルトの名無しさん [] 2025/08/24(日) 14:15:37.70 ID:veJK4T2Q >>56 C#も分割代入しない書き方はできるじゃん その場合の可読性はPythonもC++もC#もそう変わらないかと (t[0], get<0>(t), t.Item1) 意味のある名前を付けたいなら、それはRustでもstructを定義すれば済む話だし C#の匿名クラスの便利さもまあ分かるけど、あれば嬉しいくらいで、個人的には必須とまでは思わない http://mevius.5ch.net/test/read.cgi/tech/1755247770/62
63: デフォルトの名無しさん [sage] 2025/08/24(日) 14:18:45.06 ID:m/1beq6h >>62 C#には匿名型とは別にnamed tupleがあって、positional tupleと互換性を持ったままフィールドに名前を付けられる http://mevius.5ch.net/test/read.cgi/tech/1755247770/63
64: デフォルトの名無しさん [sage] 2025/08/24(日) 14:23:02.15 ID:VS0PssfI >>55 named tupleの定義が面倒&カッコ悪いな http://mevius.5ch.net/test/read.cgi/tech/1755247770/64
65: デフォルトの名無しさん [sage] 2025/08/24(日) 14:40:44.45 ID:f2gy7gmS Pythonの名前付きタプルは普通に使いにくいからな… その用途なら dataclass にしとけ、というのが共通認識だと思う http://mevius.5ch.net/test/read.cgi/tech/1755247770/65
66: デフォルトの名無しさん [sage] 2025/08/24(日) 17:03:59.99 ID:apxru5vn >>55 それは文法としてnamed tupleをサポートしてないからだよ サポートしてれば下のように書ける def foo() -> (x: int, y: int): return (x: 10, y: 20) p = foo() print(p.x, p.y) x, y = foo() print(x, y) http://mevius.5ch.net/test/read.cgi/tech/1755247770/66
67: デフォルトの名無しさん [sage] 2025/08/24(日) 17:15:02.39 ID:7zDT8kXu 事実と意見を区別しろ 前提を明確に示せ 異なる前提に依存する結論を無理に適用するな http://mevius.5ch.net/test/read.cgi/tech/1755247770/67
68: デフォルトの名無しさん [sage] 2025/08/24(日) 17:48:30.01 ID:+zGYyK0c >>66 これで済む話 let (x, y) = foo(); http://mevius.5ch.net/test/read.cgi/tech/1755247770/68
69: デフォルトの名無しさん [sage] 2025/08/24(日) 18:53:52.96 ID:xPc+Pkry >>66 筋がよくなく中途半端に感じる その型を他でも用いるならば型に名前を付けて宣言したほうがよく その場限りならば>>68 http://mevius.5ch.net/test/read.cgi/tech/1755247770/69
70: デフォルトの名無しさん [sage] 2025/08/24(日) 19:23:45.82 ID:o5OQy7cK let (manko, chinko) = foo(); // 本当のfoo()の返す中身は(chinko, manko) が許されるから、それって嫌だよねって話じゃないの? http://mevius.5ch.net/test/read.cgi/tech/1755247770/70
71: デフォルトの名無しさん [sage] 2025/08/24(日) 19:32:58.00 ID:lcXQ4DrV >>70 そうそう AIに生成させるにしても、fooが別のパッケージだったりするとシグネチャだけで要素の意味を推測できないのは辛いわな http://mevius.5ch.net/test/read.cgi/tech/1755247770/71
72: デフォルトの名無しさん [sage] 2025/08/24(日) 19:44:34.69 ID:PRkNyipX 別なら構造体を定義しろ http://mevius.5ch.net/test/read.cgi/tech/1755247770/72
73: デフォルトの名無しさん [sage] 2025/08/24(日) 22:32:48.16 ID:O8wAGFa3 >>68 どっちかというと真逆でRustの場合は1mmでも名前でアクセスしたいと感じるものは構造体を定義しないといけない >>69 中途半端に感じるのは当然 事前に構造体を定義しておくほどではないが要素には名前でアクセスしたいというものすごく中途半端な状況にこそ求められる機能だから http://mevius.5ch.net/test/read.cgi/tech/1755247770/73
74: デフォルトの名無しさん [sage] 2025/08/25(月) 06:47:36.11 ID:E2rxLwdP >>59 >>60 それらは古典的プログラミングだから無関係な処理が間に挟まったり流れが乱されるため可読性が落ちる Rustでは抽象化したプログラミングによりメソッドチェーンで繋ぐことが多い チェーンの間はタプルのまま旅を続けたとしても一つの流れなので可読性は落ちない チェーンの途中もしくは最後のforやfold系でパターンマッチングされてタプルが解消されればよい http://mevius.5ch.net/test/read.cgi/tech/1755247770/74
75: デフォルトの名無しさん [sage] 2025/08/25(月) 08:15:32.90 ID:foAG4KWU 多値戻しは_をサポートしてなければコーダーにとってはどうでもいい話じゃないんかね。 最適化機会を明示できるかどうかくらいじゃね? http://mevius.5ch.net/test/read.cgi/tech/1755247770/75
76: デフォルトの名無しさん [sage] 2025/08/25(月) 10:18:01.04 ID:hSk6qQ9G ながめてるとたしかに_多いな >fn f(init: &str, n: usize) -> String { > let mut list = init.chars().rev().collect::<Vec<_>>(); > for _ in 1..n { > if let Some((pre_index, (_, old))) = list.iter().tuple_windows().enumerate().find(|(_, (pre, cur))| pre > cur) { > let old_index = pre_index + 1; > let (new_index, _) = list.iter().enumerate().find(|(_, cur)| cur > &old).unwrap(); > list.swap(o
ld_index, new_index); > list[..old_index].reverse(); > } > } > list.into_iter().rev().collect() >} http://mevius.5ch.net/test/read.cgi/tech/1755247770/76
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 153 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.009s