2014-11-01 1 views
1

У меня есть следующий код, который я ожидал, чтобы просто работать:Ржавчина: «тип этого значения должен быть известен в этом контексте» ошибки для Float :: пи

const pi_n4th_root : f32 = Float::pi().powf(-1.0/4.0); 

, но он производит следующие ошибка:

f.rs:7:28: 7:54 error: the type of this value must be known in this context 
f.rs:7 const pi_n4th_root : f32 = Float::pi().powf(-1.0/4.0); 
            ^~~~~~~~~~~~~~~~~~~~~~~~~~ 

Я пытался добавить каждую аннотацию типа, что я могу:

const pi_n4th_root : f32 = (Float::pi() as f32).powf(-1.0/4.0 as f32) as f32; 

, но он все еще терпит неудачу с такой же ошибкой:

f.rs:7:30: 9:55 error: the type of this value must be known in this context 
f.rs:7 const pi_m4th_root : f32 = (Float::pi::<f32>() as f32).powf(-1.0/4.0 as f32) as f32; 
            ^~~~~~~~~~~~~~~~~~~~~~~~~ 

Кажется, что мне нужно как-то указать, что Float::pi вызывается для типа F32, но как это сделать?

ответ

2

К сожалению, что вы хотите сделать, не будет работать по двум причинам.

Во-первых, вы не можете ничего подобного написать:

const pi_n4th_root : f32 = Float::pi().powf(-1.0/4.0); 

То есть, вы не можете назвать какие-либо функции в постоянных определений, так как точные значения констант должны быть известны компилятору и Rust пока не имеет оценки функции компиляции.

Во-вторых, поскольку UFCS равен not yet implemented, вы не можете напрямую ссылаться на методы trait для определенного типа. Я не уверен, почему Float::pi() as f32 не работает, но вы также не можете указать желаемый тип в путях. Единственный способ сделать это - написать отдельную функцию:

#[inline] 
pub fn pi<T: Float>() -> T { Float::pi() } 

Существует много таких функций в стандартной библиотеке Rust. Для Pi постоянная, однако, есть лучший способ - вы можете использовать константу соответствующего типа непосредственно:

use std::f32; 

let pi = f32::consts::PI; 

Вы можете найти список констант here и here (вы можете нажать кнопку [SRC] ссылку, если страница сам пуст, кажется, ошибка в Rustdoc).

+0

Константы видны на странице документа 'core :: f64 :: consts', однако (http://doc.rust-lang.org/core/f64/consts/). – Levans

+0

@ Levans, я думал, что это, вероятно, ошибка в Rustdoc JS или что-то в этом роде, потому что, когда я нажимаю \ [src \], эти константы становятся видимыми на мгновение, прямо перед тем, как откроется страница с источниками. Спасибо за ссылки, так или иначе. –

+0

Да, документы сначала перенаправляют вас на «core :: f64 :: consts» перед печатью источников. – Levans

Смежные вопросы