Backticks call a shell command, but don’t return the output, it is printed. Use system to capture it.
Triple equals is less strict, like checking for range inclusion. But it’s not recommended to use over the methods.
Use rbenv to install newer versions than the system.
Unique concepts
Every method has an implicit block argument, which is called with yield
Symbols, ie :something
Global unique objects instead of memory allocated strings.
Used for hash keys, function names, etc.
Append opperator
string << "more characters"
Also for files, arrays, etc
Delimited types
%w{some words} => array of the words.
There are others too, instead of w. Multiline string is one.
They can use almost any delimeter, if curly brace wont work.
<<~EOF ... EOF as a heredoc also works, simiar to %{ ... }
String formatting
"string %s %d" % ["one", 1] Formatting with the percent sign, not terribly reccomended.
%p will inspect the object.
Interpolation with #{} is usually best.
Methods such as printf also exist
irb uses the inspect method to print objects. However, interpolation uses to_s. to_str is only for things that are actually string represented.
Flow control
do ... end blocks are the same as curly braces (but different precedence for binding)
if ... elsif ... else ... end
loop do ... end is forever loop, like while true
Both if and unless can be used as blocks. Both can be used at the end of a single line.
If statements (and every other statement) returns a value, so can be assigned to a variable
Last line in a block or method is implicitly returned.
Variables / attributes
Variable names are important
Constants start with a capital letter. Likely to be all caps, but not required.
Globals start with $,
Object attributes start with @
Class attributes start with @@
There is no public object attribute access, as if everything was private.
Objects can only have methods.
Accessors are easily defined by sybmol with attr_accessor, or attr for readonly.
Special globals
$: search path
$" loaded modules
$0 running program
$* arguments
$! current exception
$@ backtrace of current exception
Classes / objects
Class inheritance with angle bracket. class Dog < Animal
Type checking with is_a? method. Works for inherited types. But often checking for method existance (ie duck typing) is better, with respond_to?
Mixins
Define a module, then include it in a class
class X; include SomeModule; end
Often, use this to extend a class that already exists.
super is a refernce to the parent class’ method, not a reference to self as the parent type.
A method can be defined on a single object, without affecting other objects of the same class. def someObj.method ; :foobar ; end. This also works for adding class methods, but you could just define it in the class instead, by extending the class.
You can create your own metaprogramming class methods, like attr, which output class code. Usually will eventually rely on eval, instance_eval, class_eval