cfg
включает весь элемент условно.cfg_attr
включает один или несколько атрибутов условно.
В этом:
#[cfg(connection = "websocket")]
#[path = "websocket.rs"]
mod protocol;
весь модуль protocol
будет включен только в том случае, если условие истинно,но в этом:
#[cfg_attr(connection = "websocket", path = "websocket.rs")]
mod protocol;
модуль protocol
всегда включен.Если условие истинно, компилятор будет искать его источник в websocket.rs
, но если оно ложно, он будет искать в protocol.rs
.Другими словами, это эквивалентно:
#[cfg(connection = "websocket")]
#[path = "websocket.rs"]
mod protocol;
#[cfg(not(connection = "websocket"))]
mod protocol;