Thanks Dominik, That explains everything. Garth. On 1 Jan 2006, at 01:18, Dominik Bathon wrote: > On Sun, 01 Jan 2006 00:42:46 +0100, Garth Williams > <garth / penrhiw.net> wrote: > >> Hi, >> >> thread = Thread.new(thread) do |thisThread| >> # thisThread.exit >> puts "object id = #{thisThread.object_id}" >> end >> >> The code above seems to work, thisThread is the same as thread >> (proved by uncommenting out the line), however in most languages >> this would not work (I would expect thisThread to be nil), why >> does it work in ruby and is it considered good practice? > > It doesn't work: > > this_thread is nil, so this_tread.exit just calls the private > method Kernel#exit with a receiver, this is not allowed, so an > exception is thrown and the thread terminates, but you don't see > the exception. The following code should make it clear: > > thread = Thread.new(a = thread) do |this_thread| > puts "object id = #{this_thread.object_id}" > puts "thread id = #{Thread.current.object_id}" > begin > this_thread.exit > rescue Exception => e > p e > end > end > p thread.object_id > p a.object_id > p a > > Output: > object id = 4 > thread id = -604525186 > #<NoMethodError: private method `exit' called for nil:NilClass> > -604525186 > 4 > nil > > > Code like > > x = x + 1 > > without defining x before this line works, because after the parser > saw "x =", it knows that x is a variable, so "x" later returns nil > (which seems to be the default value for an uninitialized variable). > > The above code results in: > > irb(main):027:0> x = x + 1 > NoMethodError: undefined method `+' for nil:NilClass > from (irb):27 > from :0 > >> Also is there a better way to access the current thread? > > Thread.current (see above) > > Dominik >