A nyelvi elemek az ASCII karakterkészlet jeleinek sorozatából állhatnak. A program lexikális elemeit szükség esetén whitespace jelekkel határolhatjuk el egymástól, csakhogy a Ruby kicsit másként értelmezi a whitespace szót, mint más nyelvek: a szóköz és tabulátor karakterek mellett a backspace, a vertical tab, a form feed és a carriage return karakterek is idetartoznak, míg az újsor jele nem. A newline karakter csak akkor szolgál whitespace karakterként, ha a kifejezés a következő sorban egyértelműen folytatódik. Egy Ruby-program tulajdonképpen kifejezések sorozata, és az újsor-karakter általában a kifejezések elválasztására használatos. Egy soron belül a pontosvessző karakterrel érhetjük el ugyan ezt a hatást. A nyelv case sensitive, azaz megkülönbözteti a kis- és nagybetűket.
Azonosítókban alapvetően az angol ábécé kis- és nagybetűi, a számjegyek és az aláhúzás karakter szerepelhetnek. A kérdőjel, a felkiáltójel, a dollárjel és a kukac karakter használatos még az azonosítók előtt ill. után. Az azonosítóknak betűvel vagy aláhúzásjellel kell kezdődniük és betűvel, számmal vagy aláhúzásjellel kell folytatódniuk. A nagy kezdőbetűs azonosítók konvenció szerint konstansokat vagy osztályneveket jelölnek. A globális láthatóságú változók nevei elé dollárjelet kell írnunk. A kukac karakter a példányváltozók elkülönítésére szolgál. Ha az azonosító elé nem írunk dollár- vagy kukackaraktert, az vagy lokális változót, vagy alprogramot jelöl. Az alprogramok nevei kiegészíthetők a kérdőjellel illetve felkiáltójellel. Ezzel hívhatjuk fel a figyelmet arra, hogy az alprogram igaz vagy hamis értékkel tér vissza illetve veszélyes tevékenységet végez. Például egy stack nevű objektum üres voltát az stack.empty? kifejezéssel kérdezhetjük le, tartalmát pedig a stack.clear! metódus hívásával törölhetjük. Ezek az kiegészítések szerves részét képezik az azonosítónak, ami azt jelenti, hogy egy programban előfordulhat a value, a $value, a value?, vagy a value! azonosító is vagy a fenti példában szereplő stack.clear! helyett a stack.empty! is használható lenne az adatszerkezet kiürítéséhez. Rubyban nincs az azonosítók hosszúságára vonatkozó megszorítás; a határ a gép memóriája. Természetesen a nyelv felhasznál néhányat a rengeteg lehetőség közül. A foglalt szavak listája a következő:
A programban többféle numerikus literál is előfordulhat. A tízes számrendszerben felírt egész és lebegőpontos számok (pl. 123, -123, 1_23, 12.34, 1.2e-3), hexadecimális, oktális és bináris alakban felírt egész számok (pl. 0xffff, 0377, 0b1110110100), karakterek ASCII-kódjából előállított egész számok (pl. ?a, ?\C-a, ?\M-\C-a). Az aláhúzás karaktertagolásra való, a numerikus literálok belsejében figyelmen kívül hagyja az interpreter. A példákban szereplő \C- a kontroll plusz-, a \M- a meta plusz karaktereket jelöli. Minden egész típusú literál az Integer és minden lebegőpontos típusú literál a Float osztály egy-egy példánya. A stringliterálok kétfélék lehetnek: macskakörmök közé zárt stringek és aposztrófok közé zárt karaktersorozatok. A Perl és Unix shellszkriptekhez hasonlóan a dupla idézőjel az engedékenyebb forma, ebben elvégződnek a backslash jellel kezdődő escape szekvenciák helyettesítései és az ún. kifejezés-helyettesítés, míg az aposztrófok közt csak a \' és a \\ szekvenciák használhatóak. A stringliterál mindig egy sorban kell, hogy elhelyezkedjen. Stringekben és karakterliterálokban is használhatóak a - többnyire C nyelvből - jól ismert escape-szekvenciák:
Egysoros megjegyzéseket a szkriptnyelvekben megszokott # jel után írhatunk egészen a sor végéig, persze csak ha a komment jel nem egy string vagy karakterliterál belsejében fordult elő.
Többsoros kommenteket a sor elején kezdett =begin és =end utasítások közé írhatunk.