Ruby is an interpreted language, so you don't have to recompile programs written in Ruby to execute them.
Variables have no type (dynamic typing) Variables in Ruby can contain data of any type. You don't have to worry about variable typing. Consequently, it has a weaker compile time check.
No declaration needed You can use variables in your Ruby programs without any declarations. Variable names denote their scope, local, global, instance, etc.
Simple syntax Ruby has a simple syntax influenced slightly from Eiffel.
No user-level memory management Ruby has automatic memory management. Objects no longer referenced from anywhere are automatically collected by the garbage collector built into the interpreter.
Everything is an object Ruby is the purely object-oriented language, and was so since its creation. Even such basic data as integers are seen as objects.
Class, inheritance, and methods Of course, as an object-oriented language, Ruby has such basic features like classes, inheritance, and methods.
Singleton methods Ruby has the ability to define methods for certain objects. For example, you can define a press-button action for certain widget by defining a singleton method for the button. Or, you can make up your own prototype based object system using singleton methods, if you want to.
Mix-in by modules Ruby intentionally does not have the multiple inheritance as it is a source of confusion. Instead, Ruby has the ability to share implementations across the inheritance tree. This is often called 'Mix-in'.
Iterators Ruby has iterators for loop abstraction.
Closures In Ruby, you can objectify the procedure.
Text processing and regular expression Ruby has a bunch of text processing features like in Perl.
Bignums With built-in bignums, you can for example calculate factorial(400).
Exception handling As in Java(tm).
Direct access to the OS Ruby can use most UNIX system calls, often used in system programming.
Dynamic loading On most UNIX systems, you can load object files into the Ruby interpreter on-the-fly.