2017-01-29 1 views
2

Как я могу достичь следующего (pseudo Rust) со стабильной ржавчиной?Как специализироваться на стабильном канале до специализации стабилизируется?

pub fn read<T: Read>(stream: T) { 
    let stream = if T implements BufRead { 
     stream 
    } else { 
     BufReader::new(stream) 
    }; 

    // Work with `stream` 
} 

Я знаю о impl specialization, но я хочу, чтобы достичь того же со стабильной Rust.

ответ

3

С точки зрения чистого Руст, с трудом:

  • Стабильная не имеет специализации
  • Ржавчина не понижающего литья

Это, как говорится, есть альтернативы, такие как query_interfaces, которые способствуют принципиальному нисходящему потоку.

По существу, вы хотите, чтобы вызывающий абонент сообщил вам, будет ли реализован BufRead для данного потока. query_interfaces или специальное целевое решение может быть создано для отправки «необязательных» v-указателей.

Однако я бы просто потребовал, чтобы BufRead был реализован stream. Вызывающий может всегда обернуть streamBufRead::new, если это необходимо.

3

Вы не. вся причина, что RFC существует, потому что это было невозможно раньше!

Как «доказательство», рассмотрите str::to_string. До того, как существовала специализация, str::to_string использовал тот же механизм, что и все другие разработчики ToString, что означало, что ему пришлось создавать и использовать инфраструктуру форматирования. Это относительно дорого и ориентировочно ориентированы showed the difference between str::to_string and str::to_owned or String::from. После того, как специализация была включена, компилятор Rust использовал ее для str::to_string, и тесты улучшились.

Если Rust компилятор не может специализироваться, прежде чем специализации, это весьма маловероятно, что другой код может найти какой-то способ справиться с этим в общем порядке.


Для вашего конкретного случая, я согласен, что вы должны просто принять что-то реализации BufRead (fn read<T: BufRead>(stream: T)).

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