Edited at

Rubyにおけるドット記法,二重コロン記法

More than 3 years have passed since last update.

Rubyにおけるドット記法と二重コロン記法についてのメモ.


ドット記法

rubyにおけるドット記法とは,メソッド呼び出しに利用される.

形式的には, レシーバ.メソッド という形を用いる.


dot.rb

class Dot

def method
puts "Dot"
end
end

d = Dot.new
d.method
# Dot



二重コロン記法

二重コロン記法も上記のドット記法と同様にメソッド呼び出しに利用される.

形式的には, レシーバ::メソッド という形を用いる.


colon.rb


class Colon
def method
puts "Colon"
end
end

c = Colon.new
c::method
# Colon



ドット記法と二重コロン記法の違い

上記に沿えば,ドット記法も二重コロン記法も同じように利用されるかと思います.

次に記す例は,net/httpライブラリを利用して,ドキュメントを取得するためのコードです.

このコードは,二重コロン記法を用いて記述します.


net.rb

require 'net/http'

require 'uri'

url = URI::parse("http://www.ktaro.info/")
http = Net::HTTP::start(url::host,url::port)
doc = http::get(url::path)
puts doc::body
# ドキュメントが表示


では,続いて先ほどのコードをドット記法に書き換えます.


net.rb

require 'net/http'

require 'uri'

url = URI.parse("http://www.ktaro.info/")
http = Net.HTTP.start(url.host,url.port)
doc = http.get(url.path)
puts doc.body
# エラーが発生
# net.rb:5:in `<main>': undefined method `HTTP' for Net:Module (NoMethodError)


どうやら5行目にてエラーが発生しています.

エラー内容は, Netモジュール内にHTTPというメソッドが定義されていない というものです.


結論

上記のソースコードは,ドット記法と二重コロン記法の違い以外に変わりはありません.

なぜ2つのコードでそれぞれ違う結果になったかと言うと,二重コロン記法が メソッド呼び出しだけでなく,定数の呼び出しにも利用される からです.

ドット記法は,あくまでもメソッドの呼び出しに利用されます.

Rubyでは, クラスやモジュールも定数 として扱われます.

先ほどのドット記法で記述されたコードでは,Netモジュール内のHTTPクラスにアクセスしようとしましたが,ドット記法だったために,メソッドの呼び出しを行い,その結果メソッドが定義されていないというエラーが発生したというわけです.


net.rb(ドット記法[メソッド呼び出し]+二重コロン記法[クラスアクセス])

require 'net/http'

require 'uri'

url = URI.parse("http://www.ktaro.info/")
http = Net::HTTP.start(url.host,url.port)
doc = http.get(url.path)
puts doc.body
# ドキュメントが表示



まとめ

今回の記事のまとめは,以下の通りです.


  • ドット記法は,メソッド呼び出し

  • 二重コロン記法は,メソッド呼び出し+定数呼び出し

  • Rubyでは,クラスやモジュールも定数として扱われる.