It’s “just sugarcoating” for readability, but they do have common meanings:
- Methods ending in
!perform some permanent or potentially dangerous change; for example:Enumerable#sortreturns a sorted version of the object whileEnumerable#sort!sorts it in place.- In Rails,
ActiveRecord::Base#savereturns false if saving failed, whileActiveRecord::Base#save!raises an exception. Kernel::exitcauses a script to exit, whileKernel::exit!does so immediately, bypassing any exit handlers.
- Methods ending in
?return a boolean, which makes the code flow even more intuitively like a sentence —if number.zero?reads like “if the number is zero”, butif number.zerojust looks weird.
In your example, name.reverse evaluates to a reversed string, but only after the name.reverse! line does the name variable actually contain the reversed name. name.is_binary_data? looks like “is name binary data?”.