Size: a a a

Rust — русскоговорящее сообществo

2020 April 02

d

diabolo in Rust — русскоговорящее сообществo
mAX
Товарищи, помогите пожалуйста разобраться..
Выполнялся вот такой код
let stream = tokio::net::TcpStream::connect(addr).await?;
stream.set_keepalive(Some(tokio::time::Duration::from_secs(10)));
stream.set_nodelay(true);
use std::os::unix::io::AsRawFd;
let fd = stream.as_raw_fd();
unsafe {
   pub const IP_MTU_DISCOVER: libc::c_int = 10;
   pub const IP_PMTUDISC_DONT: libc::c_int = 0;
   let optval: libc::c_int = IP_PMTUDISC_DONT;
   // дальше все закомменчено!
}

такое выполнялось при каждом переподключении соединения и каждый раз процесс лови дважды сигнал SIGCHLD
при втором подключении он тупо падал, ошибки или вывода, к сожалению не смог отловить

убрал unsafe блок и вроде все норм.. SIGCHLD не приходит, работает все нормально

подскажите пожалуйста из-за чего такое может быть?
константы и optval нигде не используются, я вообще думал компилятор на этот unsafe блок забьет..
ищи трабл в отсутствии wait.
и хватит уже
источник

В

Вафель in Rust — русскоговорящее сообществo
defuz
Умники, и в чем разница между интерфейсом и трейтом?
Трейты в расте в первую очередь отличаются тем что

1) их можно имплементировать для чужих типов
2) в трейтах можно  использовать тип Self
3) в них могут быть статические методы
источник

AL

Andrey @ozkriff Lesnikov in Rust — русскоговорящее сообществo
все же помнят, что трейты в расте когда-то назывались интерфейсами, да? и ключевое слово было не trait, а iface. ох уж эти споры за терминологию
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey @ozkriff Lesnikov
все же помнят, что трейты в расте когда-то назывались интерфейсами, да? и ключевое слово было не trait, а iface. ох уж эти споры за терминологию
Это ты ещё не видел споров в оффтопике, что трейты в расте должны называться тайпклассами 😂

Но вообще думаю что под интерфейсами всё же обычно понимают то что в джаве или C#, и имеет смысл обозначить отличия
источник

В

Вафель in Rust — русскоговорящее сообществo
Можете обяснить почему этот код работает под найтли, а на стейбле выдаёт ошибку? (array_windows возвращает impl Iterator<Item = &[_; 3]>)

assert_eq!(
   [1, 2, 3, 4, 5]
       .array_windows::<[_; 3]>()
       .map(|[a, b, c]| a + b + c)
       .sum::<u32>(),
   27
)


Ошибка:

error[E0277]: the trait bound `u32: std::iter::Sum<i32>` is not satisfied
 --> src/ext/slice_ext.rs:102:10
  |
10 |         .sum::<u32>(),
  |          ^^^ the trait `std::iter::Sum<i32>` is not implemented for `u32`
  |
  = help: the following implementations were found:
            <u32 as std::iter::Sum<&'a u32>>
            <u32 as std::iter::Sum>
источник

В

Вафель in Rust — русскоговорящее сообществo
Что-то в выводе типов изменилось?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Marat
ну в смысле, если я хочу гранулярно задавать или не задавать инлайн пометодно, то надо явно имплементить?
да. Но выборочно инлайнить нужно только когда у тебя неудовлетворительны тесты на производительность, и тесты показали что с инлайном конкретной функции работа стала быстрее
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Вафель
Можете обяснить почему этот код работает под найтли, а на стейбле выдаёт ошибку? (array_windows возвращает impl Iterator<Item = &[_; 3]>)

assert_eq!(
   [1, 2, 3, 4, 5]
       .array_windows::<[_; 3]>()
       .map(|[a, b, c]| a + b + c)
       .sum::<u32>(),
   27
)


Ошибка:

error[E0277]: the trait bound `u32: std::iter::Sum<i32>` is not satisfied
 --> src/ext/slice_ext.rs:102:10
  |
10 |         .sum::<u32>(),
  |          ^^^ the trait `std::iter::Sum<i32>` is not implemented for `u32`
  |
  = help: the following implementations were found:
            <u32 as std::iter::Sum<&'a u32>>
            <u32 as std::iter::Sum>
ты пытаешься i32 суммировать как u32
источник

ШН

Шерзод Немножко Токсик in Rust — русскоговорящее сообществo
@ozkriff почему тебя нет в оффтопике?
источник

AL

Andrey @ozkriff Lesnikov in Rust — русскоговорящее сообществo
Шерзод Немножко Токсик
@ozkriff почему тебя нет в оффтопике?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Вафель
Что-то в выводе типов изменилось?
1,2,3,4,5 по умолчанию считаются как i32 тип.
источник

В

Вафель in Rust — русскоговорящее сообществo
polunin.ai
ты пытаешься i32 суммировать как u32
Однако на найтли типы почему-то выводяться и компилятор понимает что там массив u32
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Вафель
Однако на найтли типы почему-то выводяться и компилятор понимает что там массив u32
значит на найтли шаманят с выводом типов. в стейбле компилятор не умеет проверять типы если тип указан в слудеющем комбинаторе.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
сам сталкивался, приходилось писать
foo()
 .map(|i| i as f32)
 ...
источник

r

red75prime in Rust — русскоговорящее сообществo
polunin.ai
сам сталкивался, приходилось писать
foo()
 .map(|i| i as f32)
 ...
Это же каст, а не хинт для вывода типов.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
red75prime
Это же каст, а не хинт для вывода типов.
да, потому что вывести тип компилятор не мог)
источник

В

Вафель in Rust — русскоговорящее сообществo
Вафель
Можете обяснить почему этот код работает под найтли, а на стейбле выдаёт ошибку? (array_windows возвращает impl Iterator<Item = &[_; 3]>)

assert_eq!(
   [1, 2, 3, 4, 5]
       .array_windows::<[_; 3]>()
       .map(|[a, b, c]| a + b + c)
       .sum::<u32>(),
   27
)


Ошибка:

error[E0277]: the trait bound `u32: std::iter::Sum<i32>` is not satisfied
 --> src/ext/slice_ext.rs:102:10
  |
10 |         .sum::<u32>(),
  |          ^^^ the trait `std::iter::Sum<i32>` is not implemented for `u32`
  |
  = help: the following implementations were found:
            <u32 as std::iter::Sum<&'a u32>>
            <u32 as std::iter::Sum>
Ладно, с .array_windows::<[u32; 3]>() вроде работает и на стейбле
источник

r

red75prime in Rust — русскоговорящее сообществo
polunin.ai
да, потому что вывести тип компилятор не мог)
Не понимаю. Если i не f32, то компилятор, естественно, не мог вывести, что i - это f32. А если foo() дженерик, то as делает невозможным вывод типа возвращаемого foo()
источник

В

Вафель in Rust — русскоговорящее сообществo
ЧЯДНТ?

Судя по trace_macros!(true) у меня всё разворачивается правильно, но компилятор всё равно жалуется на `...`:

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=a168c10cbbaa3062d117a72070c06801

Причём добавление запятой, которая ничего не меняет всё чинит, wtf...
источник

В

Вафель in Rust — русскоговорящее сообществo
Призываю магистров макросов
источник