前提
Rust でプログラムを組んでいます。
traitのデフォルトメソッドから構造体のフィールドの値を表示ようなメソッドを作成したいですが、記述方法がわかりません。
そもそもできないのでしょうか?
有識者の方、ご教示のほどよろしくお願いします。
ソース
具体的なサンプルソースです。
- how_money メソッド(7行目)で、Apple.value をアテにしてreturn しています。
Rust
1struct Apple { 2 value: i32, 3} 4 5trait FruitTrait { 6 fn how_money(&self) -> i32 { 7 return self.value 8 } 9} 10 11impl FruitTrait for Apple{} 12 13fn main() { 14 let fruit = Apple{value: 300}; 15 println!("{}", fruit.how_money()); 16}
(上記の構造体は、Apple 一つですが、実際はOrange、Mango、Pine、、、、等多数になる予定です。)
発生している問題・エラーメッセージ
error[E0609]: no field `value` on type `&Self` --> src/main.rs:12:17 | 8 | trait FruitTrait { | ---------------- type parameter 'Self' declared here ... 12 | return self.value | ^^^^^ For more information about this error, try `rustc --explain E0609`. error: could not compile `playground` due to previous error
試したこと
以下の様にソースを修正したら、理想の形に近くはなりましたが、get_value が手間かかりますので、もう少し手間を省けないかと思っている次第です。
- get_value() をtraitに追加。
- impl の中でget_value() にvalueを返す用に指定。
あと、implの中で、how_money()を実行するためにget_value()を必ず実装しなければならないという制約もプログラムが複雑になってくると保守性が悪くなるのではと懸念しています。
rust
1struct Apple { 2 value: i32, 3} 4 5trait FruitTrait { 6 fn how_money(&self) -> i32 { 7 return self.get_value() 8 } 9 10 fn get_value(&self) -> i32; 11 12} 13 14impl FruitTrait for Apple { 15 fn get_value(&self) -> i32 { 16 return self.value 17 } 18} 19 20fn main() { 21 let fruit = Apple{value: 300}; 22 23 println!("{}", fruit.how_money()); 24}
補足情報(FW/ツールのバージョンなど)
環境:
$ rustc --version rustc 1.66.0 (69f9c33d7 2022-12-12)
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/12/30 15:02 編集