Hi.

Seems I ran into a Heisenbug - the behaviour of my application changes
when I add or remove non-relevant code somewhere - seems it doesn't
really matter where. For that reason I can't really debug or isolate the
bug. :/

I've uploaded the application at:

http://noegnud.sf.net/flgr/foobar.tar.gz

It's about 630 lines. It's a incomplete framework for (german) 
textadventures (sorry about the german text - all classnames etc. are 
english tho)

At basicthing.rb:315 I added a puts which made the program work:

flexo@majestix foobar $ ruby gold.rb 
...
> n
{:ipreps=>[], :verb=>["s\374den", "s"], :dpreps=>[]}  (sueden == south)
{:ipreps=>[], :verb=>["norden", "n"], :dpreps=>[]}    (norden == north)
Heisenbug!
Du bist in einem dichtem Nadelwald. (This is the description of the new
room - the player went to north)

The loop at basicthing.rb:248-323 is supposed to iterate through all
actions until it finds a matching one (checking the prepositions and 
number of objects) and then executes the action's proc.

(The action for "n" (short for "Norden" - north in german) is defined
at evolution.rb:20.)

When I remove basicthing.rb:315 I get:

> n
{:ipreps=>[], :verb=>["i", "inv", "inventar"], :dpreps=>[]}
{:ipreps=>[], :verb=>["osten", "o"], :dpreps=>[]}
{:prefix=>["runter", "herunter", "raus", "heraus"], :ipreps=>["vom",
"von", "aus"], :verb=>["n", "nimm", "nehm", "nehme"], :iobj=>:optional,
:dobj=>:required, :dpreps=>[]}
{:ipreps=>[], :verb=>["unten", "u"], :dpreps=>[]}
{:ipreps=>[], :verb=>["s\374den", "s"], :dpreps=>[]}
{:ipreps=>[], :verb=>["norden", "n"], :dpreps=>[]}
{:ipreps=>[], :verb=>["oben", "ob"], :dpreps=>[]}
{:ipreps=>[], :prefix=>["um"], :verb=>["schau", "schaue"],
:dobj=>:optional, :dpreps=>[]}
{:ipreps=>[], :prefix=>["hin", "rein", "herein"], :verb=>["geh",
"gehe"], :dobj=>:required, :dpreps=>["nach", "zum", "zu", "in"]}
{:ipreps=>[], :verb=>["westen", "w"], :dpreps=>[]}
Ich verstehe nicht.

("Ich verstehe nicht" == "I don't understand" - no matching action could
be found) 

As you can see it did check for the "move north" action:

{:ipreps=>[], :verb=>["norden", "n"], :dpreps=>[]}

But for some reason it decided that it doesn't match. I can't figure out
why since adding debug-statements breaks/unbreaks it again...

Actually the "puts" doesn't really matter - removing or adding more
rooms or objects causes the behaviour to change, removing properties of
objects does, hell, even changing the (ignored) return-value of some
#properties methods does.

Running it with -d also makes the bug go away for me. 
So does set_trace_func().

Someone in #ruby-lang reported the opposite behaviour with the same code
(breaks *with* the puts, runs fine without) and different behaviour
between different ruby versions.

22:41 <@dblack> fn: you can use me as a witness if you want :-)

I'm not doing really exotic stuff so... looks like a ruby-bug for me.

Would be nice if someone would take a look at it.

-flexo