rustlingsのerrors6の問題が分かりません。
ParsePosNonzeroError Enumのメソッド追加とparse_pos_nonzero関数の編集を行って、下にあるtest_parse_errorというテストをパスするように改修するというのが全体の目的です。
不親切にもrustlingsは回答を一切用意していないのでここで質問させていただきます。
分かる方よろしくお願いします。
rust
1// errors6.rs 2 3// Using catch-all error types like `Box<dyn error::Error>` isn't recommended 4// for library code, where callers might want to make decisions based on the 5// error content, instead of printing it out or propagating it further. Here, 6// we define a custom error type to make it possible for callers to decide 7// what to do next when our function returns an error. 8 9// Make these tests pass! Execute `rustlings hint errors6` for hints :) 10 11// I AM NOT DONE 12 13use std::num::ParseIntError; 14 15// This is a custom error type that we will be using in `parse_pos_nonzero()`. 16#[derive(PartialEq, Debug)] 17enum ParsePosNonzeroError { 18 Creation(CreationError), 19 ParseInt(ParseIntError) 20} 21 22impl ParsePosNonzeroError { 23 fn from_creation(err: CreationError) -> ParsePosNonzeroError { 24 ParsePosNonzeroError::Creation(err) 25 } 26 // TODO: add another error conversion function here. 27} 28 29fn parse_pos_nonzero(s: &str) 30 -> Result<PositiveNonzeroInteger, ParsePosNonzeroError> 31{ 32 // TODO: change this to return an appropriate error instead of panicking 33 // when `parse()` returns an error. 34 let x: i64 = s.parse().unwrap(); 35 PositiveNonzeroInteger::new(x) 36 .map_err(ParsePosNonzeroError::from_creation) 37} 38 39// Don't change anything below this line. 40 41#[derive(PartialEq, Debug)] 42struct PositiveNonzeroInteger(u64); 43 44#[derive(PartialEq, Debug)] 45enum CreationError { 46 Negative, 47 Zero, 48} 49 50impl PositiveNonzeroInteger { 51 fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> { 52 match value { 53 x if x < 0 => Err(CreationError::Negative), 54 x if x == 0 => Err(CreationError::Zero), 55 x => Ok(PositiveNonzeroInteger(x as u64)) 56 } 57 } 58} 59 60#[cfg(test)] 61mod test { 62 use super::*; 63 64 #[test] 65 fn test_parse_error() { 66 // We can't construct a ParseIntError, so we have to pattern match. 67 assert!(matches!( 68 parse_pos_nonzero("not a number"), 69 Err(ParsePosNonzeroError::ParseInt(_)) 70 )); 71 } 72 73 #[test] 74 fn test_negative() { 75 assert_eq!( 76 parse_pos_nonzero("-555"), 77 Err(ParsePosNonzeroError::Creation(CreationError::Negative)) 78 ); 79 } 80 81 #[test] 82 fn test_zero() { 83 assert_eq!( 84 parse_pos_nonzero("0"), 85 Err(ParsePosNonzeroError::Creation(CreationError::Zero)) 86 ); 87 } 88 89 #[test] 90 fn test_positive() { 91 let x = PositiveNonzeroInteger::new(42); 92 assert!(x.is_ok()); 93 assert_eq!(parse_pos_nonzero("42"), Ok(x.unwrap())); 94 } 95}
Teratialではコードを書いてほしい、課題を解いてほしいなどの質問は推奨されていません。 https://teratail.com/help/avoid-asking
実際に作業に取り組んで、つまづいたことについて質問してください。`rustlings hint errors6`でヒントを表示すると少し先に進めるかもしれません。
もちろん自分でいろいろ試したんですが、質問した時点で最初の状態まで戻してしまっていたのでこのような形で質問してしまいました。すみませんでした。
今朝改めて試したところ無事クリアできました。
そうだったんですね。承知しました。また、無事クリアできたということで良かったです!
参考までに、模範解答のようなものを回答欄に書きました。
rustlingsなどを進めるうえでのカジュアルな質問(解き方のヒントや、回答を添削してほしいなど)については、SlackのRust日本語コミュニティーで聞いてみるのもいいかもしれません。よかったら参加してみてください。
- https://rust-jp.slack.com/
- 入会フォーム: http://rust-jp.herokuapp.com/
回答2件
あなたの回答
tips
プレビュー