Garth Williams
1/1/2006 10:31:00 AM
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
>