Sometimes I see methods in Ruby that have "?" and "!" at the end of them, e.g:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
I was wondering what their purpose is? Are they just syntax sugarcoating?
It's "just sugarcoating" for readability, but they do have common meanings:
!
perform some permanent or potentially dangerous change; for example:
Enumerable#sort
returns a sorted version of the object while Enumerable#sort!
sorts it in place.ActiveRecord::Base#save
returns false if saving failed, while ActiveRecord::Base#save!
raises an exception.Kernel::exit
causes a script to exit, while Kernel::exit!
does so immediately, bypassing any exit handlers.?
return a boolean, which makes the code flow even more intuitively like a sentence — if number.zero?
reads like "if the number is zero", but if number.zero
just 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?".