Changes for 1.9 Incompatible (Severe) * New syntax and semantics o Block arguments are always local o Block arguments o New semantics for block arguments o Block local variables * String o No longer an Enumerable o ?c semantics o "One-char-wide" semantics for String#[] and String#[]= [Ruby2] o Encoding-awareness * IO operations o IO#getc Incompatible (Trivial) * New syntax and semantics o Method used for splat arguments: #to_splat o defined? and local variables * Kernel and Object o Kernel#require * Class and Module o Class variables behavior o Module#attr is an alias of attr_reader o Module#instance_methods, #private_instance_methods, #public_instance_methods o Extra subclassing check when binding UnboundMethods * Exceptions o Equality of exceptions o SystemStackError o SecurityError o Removed Exception#to_str [Ruby2] * Array o Array#nitems o Array#[m,n] = nil places nil in the array. * Hash o Hash#to_s is equivalent to Hash#inspect o Semantics for Hash#each and Hash#each_pair o Hash#select * Integer o Integer(nil) raises TypeError * Struct o Struct#inspect * File and Dir operations o #to_path in File.path, File.chmod, File.lchmod, File.chown, File.lchown, File.utime, File.unlink... [Ruby2] o Dir.[], Dir.glob o Dir.exist? * IO operations o Non-blocking IO o IO#getbyte, IO#readbyte, StringIO#getbyte, StringIO#readbyte o Kernel#open takes encoding specified o IO#initialize now accepts an IO argument o StringIO#readpartial o IO#lines o IO#bytes o IO.try_convert o Limit input in IO#gets, IO#readline, IO#readlines, IO#each_line, IO#lines, IO.foreach, IO.readlines, StringIO#gets, StringIO#readline, StringIO#each, StringIO#readlines o IO#ungetc, StringIO#ungetc o IO#internal_encoding, IO#external_encoding, IO#set_encoding o IO.pipe takes encoding option * Time o New format in Time#to_s o Timezone information preserved on Marshal.dump/load * Symbols: restriction on literal symbols * $SAFE and bound methods * Deprecation o VERSION and friends o Kernel.to_a o Kernel#getc o Object#type o Hash#index o ENV.index o Symbol#to_int o Removed Array and Hash #indices, #indexes o libraries: base64, mailread, getopts, parsearg, soap, wsdl Compatible * New syntax and semantics o New literal hash syntax o New syntax for lambdas o .() and calling Procs without #call/#[] o Mandatory arguments after optional arguments allowed o Multiple splats allowed o Arguments to #[] o printf-style formatted strings (%) o Newlines allowed before ternary colon * Kernel and Object o BasicObject o #instance_exec o Object#=~ o Object#tap o Kernel#instance_variable_defined? o Kernel#define_singleton_method o Kernel#singleton_methods, Kernel#methods * Class and Module o Module#const_defined?, #const_get and #method_defined? o Module#class_variable_defined? o #class_variable_{set,get} o Class of singleton classes o #module_exec * Binding#eval * Blocks and Procs o Arity of blocks without arguments o proc is now a synonym of Proc.new * Blocks and Procs o Proc#yield o Passing blocks to #[] o Proc#lambda? * Enumerable and Enumerator o Enumerable methods called without a block o Enumerable#cycle o Enumerable#each_with_index o Enumerable#first(n) o Enumerable#group_by o Enumerable#find_index o Enumerable#take o Enumerable#drop o Enumerable#take_while o Enumerable#drop_while o Enumerator#each o Enumerable#inject (#reduce) without a block o Enumerable#count o Enumerable#reduce o Enumerator#with_index o Enumerable##min_by, #max_by o Enumerable#zip o Enumerable#minmax and minmax_by o Enumerator#rewind o Enumerator#next * Regexp#match, String#match o Regexp#match, String#match * Fiber: coroutines/micro-threads * Array o Block argument to Array#index, Array#rindex [Ruby2] o Array#combination o Array#permutation o Array#product o Array#pop, Array#shift o Array#to_s is equivalent to Array#inspect o Array.try_convert * Hash o preserving item insertion order o Hash#_compare_by_identity and Hash#compare_by_identity? o Hash.try_convert * Integer o Integer#odd?, #even? o Integer#pred * Method o Method#receiver o Method#name o Method#owner * Numeric o Numeric#upto, #downto, #times, #step o Numeric#scalar?, Complex#scalar? o Numeric#div o Numeric#fdiv * Range o Range#cover? o Range#include? o Range#min, Range#max * Regexp o Regexp#=== matches symbols o Regexp.try_convert * String o String#clear o String#each_char o String#ord o String#partition, #rpartition o String#lines o String#bytes o String#encoding o String#force_encoding o String#start_with?, #end_with? o String#unpack with a block o String#hash o String#upto o String.try_convert o String.encoding, String#force_encoding, String#encode * Symbol o Zero-length symbols allowed o Symbol#=== matches strings o Symbol#intern o Symbol#encoding o Symbol methods similar to those in String * Math o Math#log and Math#log2 * File and Dir operations o New methods * Process o Process.setrlimit o Process.daemon o Process.exec * Misc. new methods o public_send o GC.stress, GC.stress= o Method#hash, Proc#hash o __method__ and __callee__ o Symbol#to_proc * Implementation * Memory Diet * Object Compaction - Object, Array, String, Hash, Struct, Class, Module * st_table compaction (inlining small tables) * YARV