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 モジュールのメソッドはすべてモジュール関数です。
http://doc.okkez.net/191/view/method/Module/i/module_function
…
module_function はメソッドに「モジュール関数」という属性をつけるメソッドではなく、プライベートメソッドとモジュールの特異メソッドの 2 つを同時に定義するメソッドです。
とある。