Math.sin(arg)と include Math; sin(arg) の sin は別物

モジュール関数は、モジュール名付きで呼ぶ場合と、includeしてからモジュール名なしで呼ぶ場合との二通りの呼び方が可能だ。このとき、両者は別々のメソッドを呼んでいる。

前者はモジュールの特異メソッド、後者はモジュールのprivateインスタンスメソッドである。機能としては実質的に同じであるから、このことを特別気にする必要はないけれど。


両者が別々のメソッドを呼んでいることは、以下のようにして確認できる。

$ cat sample.rb
#! /usr/local/bin/ruby

module Math
  def Math.sin(arg)
    puts "I am Math.sin"
  end

  def sin(arg)
    puts "I am sin"
  end
end

Math.sin(0)
include Math
sin(0)

$ ./sample.rb
I am Math.sin
I am sin

リファレンスマニュアルにも、

モジュール関数とは、プライベートメソッドであると同時にモジュールの特異メソッドでもあるようなメソッドです。例えば Math モジュールのメソッドはすべてモジュール関数です。

module_function はメソッドに「モジュール関数」という属性をつけるメソッドではなく、プライベートメソッドとモジュールの特異メソッドの 2 つを同時に定義するメソッドです。

http://doc.okkez.net/191/view/method/Module/i/module_function

とある。