A Value Object is a small simple object, like money or a date range, whose equality isn't based on identity (see reference object below). Instead, it's based on the value of its attributes. Value objects are immutable. Once they are created, their state cannot be changed. Examples of value objects include strings, numbers, and dates.
In Ruby, a reference object is an object whose identity is based on its reference rather than its value. This means that two reference objects are considered equal if they reference the same object in memory, regardless of their content. Reference objects are mutable, meaning their state can be changed after they are created. Examples of reference objects include instances of custom classes, arrays, and hashes.