佐々木と申します。

下記プログラムを実行したときの「globalのbarではなくFoo#barが呼ばれる」部分はなぜそうなるのでしょうか。
直感的には「globalのbar」が呼ばれそうに思います。

class Foo
  def bar(a,b)
    puts "Foo#bar(#{a},#{b})"
  end
  def baz
    hello(3,4)
    Poo.hello(7,8)
  end
end

def bar(e,f)
  puts "global bar(#{e},#{f})"
end

def hello(c,d)
  bar(c,d) # globalのbarではなくFoo#barが呼ばれる
end

class Poo
  def self.bar(i,j)
    puts "Poo.bar(#{i},#{j})"
  end
  def self.hello(g,h)
    bar(g,h) # Poo.barが呼ばれる
  end
end

f2 = Foo.new
f2.baz
hello(1,2)

=begin
% ruby1.9 -v x.rb
ruby 1.9.0 (2008-03-01 revision 15664) [i686-darwin8.11.1]
Foo#bar(3,4)
Poo.bar(7,8)
global bar(1,2)

% ruby187 -v x.rb
ruby 1.8.7 (2008-06-20 patchlevel 22) [i686-darwin8.11.1]
Foo#bar(3,4)
Poo.bar(7,8)
global bar(1,2)
=end