Verilog: Implementation Using Primitive Modules vs. Bit-wise Operators
Why not use Boolean operators?

assign Z = (a != b) != c; 
assign cout = (a &amp;&amp; b) || ((a != b) &amp;&amp; cin);


All three options are functionally equivalent ways of implementing a standard full adder.

The simple answer to your question (and to my rhetorical one) is probably simply that your textbook is trying to build up knowledge, starting with low level design and working up. 

In the Verilog module we teach at uni, we start off with primitives (gate level), then move on to Verilog bitwise and Boolean operators, then move to higher levels of abstraction (e.g. {cout, Z} = a + b + cin). We find that this helps introduce people who may not have a strong programming or digital background into FPGA design, allowing them to get a feel for how higher and higher levels of abstraction work.