Closed
Description
The inverse() function introduced in the Generics chapter and 'solved' in the Traits chapter does not actually work. Even after adding the #![feature(std_misc)] attribute to the crate, it refuses to compile:
#![feature(std_misc)]
use std::num::Float;
fn inverse<T: Float>(x: T) -> Result<T, String> {
if x == Float::zero() { return Err("x cannot be zero!".to_string()) }
let one: T = Float::one();
Ok(one / x)
}
fn main() {
let x = inverse(0.0);
match x {
Ok(x) => println!("The inverse of 25 is {}", x),
Err(msg) => println!("Error: {}", msg)
}
}
yields:
src/main.rs:2:5: 2:20 warning: use of deprecated item: replaced by inherent methods; use rust-lang/num for generics, #[warn(deprecated)] on by default
src/main.rs:2 use std::num::Float;
^~~~~~~~~~~~~~~
src/main.rs:4:15: 4:20 warning: use of deprecated item: replaced by inherent methods; use rust-lang/num for generics, #[warn(deprecated)] on by default
src/main.rs:4 fn inverse<T: Float>(x: T) -> Result<T, String> {
^~~~~
src/main.rs:1:1: 1:22 error: unstable feature
src/main.rs:1 #![feature(std_misc)]
^~~~~~~~~~~~~~~~~~~~~
note: this feature may not be used in the beta release channel
error: aborting due to previous error
Could not compile `generics`.
The solution should look like this:
extern crate num;
use num::Float;
fn inverse<T>(x: T) -> Result<T, String> where T: Float {
if x == T::zero() { return Err("x cannot be zero!".to_string()) }
let one: T = T::one();
Ok(one / x)
}
fn main() {
let x = inverse(25.0);
match x {
Ok(x) => println!("The inverse of 25 is {}", x),
Err(msg) => println!("Error: {}", msg)
}
}
/*
Cargo.toml file must include this:
[dependencies]
num = "0.1.22"
*/
Metadata
Metadata
Assignees
Labels
No labels