Rustで以下のようなコードがあるとき、 Sides
と SidesRatio
の is_valid
メソッドをトレイト等を使って奇麗に共通化することは可能でしょうか。
rust
1pub mod geometry { 2 pub mod triangle { 3 // 各辺の長さ 4 pub struct Sides { 5 a: f64, 6 b: f64, 7 c: f64, 8 } 9 10 impl Sides { 11 pub fn new(a: f64, b: f64, c: f64) -> Sides { 12 Sides { a, b, c } 13 } 14 15 pub fn is_valid(self) -> bool { 16 return self.a > 0.0 17 && self.b > 0.0 18 && self.c > 0.0 19 && (self.a + self.b) > self.c 20 && (self.b + self.c) > self.a 21 && (self.c + self.a) > self.b; 22 } 23 } 24 25 // 各辺の比率 26 pub struct SidesRatio { 27 a: f32, 28 b: f32, 29 c: f32, 30 } 31 32 impl SidesRatio { 33 pub fn new(a: f32, b: f32, c: f32) -> SidesRatio { 34 SidesRatio { a, b, c } 35 } 36 37 // Sides::is_valid と完全に同一な内容 38 pub fn is_valid(self) -> bool { 39 return self.a > 0.0 40 && self.b > 0.0 41 && self.c > 0.0 42 && (self.a + self.b) > self.c 43 && (self.b + self.c) > self.a 44 && (self.c + self.a) > self.b; 45 } 46 } 47 48 #[cfg(test)] 49 mod tests { 50 use super::*; 51 52 #[test] 53 fn test () { 54 let sides = Sides::new(3.0, 4.0, 5.0); 55 assert_eq!(sides.is_valid(), true); 56 57 let sides_ratio = SidesRatio::new(3.0, 4.0, 5.0); 58 assert_eq!(sides_ratio.is_valid(), true); 59 } 60 } 61 } 62}
単純に以下のようにトレイト化すると、pubの記入で構文エラーとなり、selfもコンパイル時にSizeがわからないということでダメそうです。
pub trait IsValid { pub fn is_valid(self) -> bool { return self.a > 0.0 && self.b > 0.0 && self.c > 0.0 && (self.a + self.b) > self.c && (self.b + self.c) > self.a && (self.c + self.a) > self.b; } }
コードは以下に置いてあります。
Rust playground
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/06/14 14:43 編集