Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the purpose of "!" and "?" at the end of method names?

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?

like image 698
itsaboutcode Avatar asked Aug 24 '11 16:08

itsaboutcode


People also ask

What is the Ruby convention for naming methods?

By convention, method names begin with a lowercase letter. (Method names can begin with a capital letter, but that makes them look like constants.) When a method name is longer than one word, the usual convention is to separate the words with underscores like_this rather than using mixed case likeThis .

What is exclamation mark Ruby?

In Ruby, methods that end with exclamation marks typically modify the object they're called on. Ruby calls them dangerous methods, the exclamation mark in the method name could be considered a warning sign. This principle keeps method names shorter and makes the code easier to understand.

What is ||= in Ruby?

||= is called a conditional assignment operator. It basically works as = but with the exception that if a variable has already been assigned it will do nothing. First example: x ||= 10. Second example: x = 20 x ||= 10. In the first example x is now equal to 10.


1 Answers

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#sort returns a sorted version of the object while Enumerable#sort! sorts it in place.
    • In Rails, 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.
  • 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", 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?".

like image 68
jtbandes Avatar answered Oct 03 '22 09:10

jtbandes