В Rust как передать расходящуюся функцию в качестве параметра другой функции - PullRequest
2 голосов
/ 10 апреля 2019

Не расходящиеся функции работают нормально

fn test(f: &Fn() -> u8) {}

Но я не могу принять такую ​​расходящуюся функцию, как эта

fn test_diverging(f: &Fn() -> !) {}

Я получаю следующую ошибку

error[E0658]: The `!` type is experimental (see issue #35121)
  --> examples/two_tasks.rs:44:31
   |
44 | fn test_diverging(f: &Fn() -> !) {}
   |                               ^

Глядя на выпуск # 35121 Я мог видеть, как это могло бы это исправить, но в то же время есть ли обход?

Ответы [ 4 ]

8 голосов
/ 10 апреля 2019

! в некоторых контекстах все еще является экспериментальным, что означает, что он недоступен в стабильном компиляторе (1,33 на сегодняшний день).Вы можете использовать его на ночном компиляторе, но вы должны явно включить feature(never_type):

#![feature(never_type)]
fn test_diverging(f: &Fn() -> !) {}

( детская площадка )

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

См. также

6 голосов
/ 10 апреля 2019

Использование типа never в функциях и типах указателей на функции уже стабильно.Поэтому, если вам не нужно использовать черту Fn, вы можете просто использовать это:

fn test_diverging(f: fn() -> !) {}
//                   ^ note the lowercase f

test_diverging(|| panic!("ouch"));

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

2 голосов
/ 10 апреля 2019

Если вы хотите остаться в стабильном состоянии, вы можете использовать Void (в основном перечисление без вариантов, которое нельзя создать без небезопасного) в качестве обходного пути.

Детская площадка ссылка

1 голос
/ 10 апреля 2019

Чтобы использовать нестабильную функцию, вам нужно использовать ночной набор инструментов и активировать нужную нестабильную функцию.

#![feature(never_type)]

fn test_diverging(f: &Fn() -> !) {}

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...