начну с конца - в стандартной библиотеке есть типаж From, у которого есть такие реализации:
impl From<Box<str>> for String
impl<'a> From<&'a str> for String
impl<'a> From<Cow<'a, str>> for String
и там-же есть общая реализация:
impl<T> From<T> for T
и в системной библиотеке это работает, а у меня почему-то нет:
pub trait GetterExt<T> {
type Err;
fn get_value(&self, path: impl AsRef<str>) -> Result<Option<T>, Self::Err>;
}
impl<T: FromStr> GetterExt<T> for Value {
type Err = T::Err;
fn get_value(&self, path: impl AsRef<str>) -> Result<Option<T>, T::Err> {
let mut cursor = self;
for name in path.as_ref().split(unsafe { SEPARATOR }) {
println!("{}", name);
match cursor.get(name) {
Some(next) => {
cursor = next;
}
None => {
return Ok(None);
}
}
}
format!("{}", cursor).as_str().parse().map(|v| Some(v))
}
}
impl GetterExt<f64> for Value {
type Err = ();
fn get_value(&self, path: impl AsRef<str>) -> Result<Option<f64>, Self::Err> {
let mut cursor = self;
for name in path.as_ref().split(unsafe { SEPARATOR }) {
println!("{}", name);
match cursor.get(name) {
Some(next) => {
cursor = next;
}
None => {
return Ok(None);
}
}
}
Ok(cursor.as_float())
}
}
ошибка:
error[E0119]: conflicting implementations of trait `GetterExt<f64>` for type `toml::value::Value`:
--> config/src/lib.rs:61:1
|
41 | impl<T: FromStr> GetterExt<T> for Value {
| --------------------------------------- first implementation here
...
61 | impl GetterExt<f64> for Value {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `toml::value::Value`
я чего-то не врубаюсь - что все-таки можно сейчас, а что нельзя?
Насколько я знаю, специализацию еще не стабилизировали, но стандартной библиотеке разрешено использовать всякие ночные штуки, в том числе и #![feature(specialization)]. Подозреваю, в этом дело.
@chessnokov в чем именно у тебя вопрос-то? Ночная версия специализации работает в целом как в рфц и описано было. До стабилизации этой фиче еще далековато, в задаче выше есть список пустых чекбоксов со ссылками.
Ну да, но это требует #![feature(specialization)] и специального указания default fn, чтобы у компилятора было дерево выбора. @chessnokov, думай как компилятор, и всё будет ОК! =)