Hi,

Here's the brief list of changes from 1.4.x to 1.6.0.
This list is by courtesy of Tomoya Akamatsu.

= Changes in 1.6.0

* class variables
* every built-in class calls initialize from new
* Object#initialize takes exactly 0 argument
* no to_a for multiple assignment (uses to_ary if available)
* block_given? (new name for iterator?)
* nice error messages (e.g. when you use global variabls for
  formal argument)
* escape unprintable characters in error messages
* RangeError exception
* ScriptError exception
* rescue => variable
* rescue modifier
* rescue clause for method body
* syntax enhanced, e.g.

  a,b = File::split "foo/bar"
  a = yield b
  [1,2,3].sort do|a,b| b<=>a end.reverse
  [File::dirname "foo/bar"]

* any object is now freezable
* -e does not use temporary file
* -X renamed to -C
* RUBYOPT environment variabls
* RUBYLIB_PREFIX environment variabls
* security ($SAFE) bugfixes
* get stack limit by getrlimit(2)
* GC threshold has changed
* singleton method for nil,true,false
  no singleton method for Fixnums and Symbols yet
* consistent behavior for clone and dup
* recycles dyna_var structure
* built-in 'final'
* no more Thread.join
* ThreadGroup
* Thread.start now takes arguments
* Thread priority
* thread aware debugger
* select does not busy wait anymore
* waitpid does not busy wait anymore
* new regex \G (?>...)
* regex does not support  \< and \> offically
* interrupt aware regex match
* regex option /p renamed to /m
* the default for $KCODE is now NONE (was EUC)
* String#index's offset can handle multibyte characters
* compile time string concatenation
* better performance for string operations
* slice, slice!
* String#index, == uses the value of $=
* lazy copy for String#dup
* Kernel#scan
* pack/unpack unerstands e(LE float), E(LE double), g(BE
  float), G(BE double), M(Q-encoding), U(utf-8), w(BER),
  Z(zero padded string)
* Bignum can be packed
* Array#concat, Array#+, Array#replace does not convert implicitly
* Array#at, first, last
* Array#filter -> Array#collect!
* spaces can be escaped using backslashes within %w()
* Enumerable#collect without block
* return value for grep has changed
* Numeric#truncate
* Float#nan?, infinite?, finite?
* Integer#modulo
* consistent %, divmod
* nil as valid Hash value
* zsh like recursive wildcard (**)
* own fnmatch implementation by eban
* Dir::glob can take block
* IO#open takes block, IO#new does not (Dir too)
* printf can be specify argument order using $
* IO#sysread detects buffering error
* IO#pid
* IO#seek's argument can be omitted (default: SEEK_SET)n
* IO#rewind set its line number to 0
* Proc#call distinguishes nil and no argument
* IO#stat now returns a File::Stat object, not a Struct::Stat
* rand's argument can be omitted (default: 0)
* Symbol object
* date2 integrated into date library
* Time::local, Time::gm can take micro seconds
* Time::utc, Time#utc, Time#utc?
* Process#wait2, waitpid2
* blocks can be retrieved by rb_scan_args()