[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Why does this work?

Garth Williams

12/31/2005 11:43:00 PM

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?

Also is there a better way to access the current thread?

Thanks.

Garth.


2 Answers

Dominik Bathon

1/1/2006 1:18:00 AM

0

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


Garth Williams

1/1/2006 10:31:00 AM

0

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
>