コロンという記号はよくプログラミング言語で特別な意味を持つキャラクターとして使われますが、Rubyでも特殊な用途で使われます。もし、Rubyのプログラムの中でコロン「:」を見つけたら、ぜひ注意してその用途をチェックしてください。
今回はRubyの文法に詳しくない方のために、Rubyにおけるコロンの使い方について解説します。
Rubyで使われるコロンの種類
Rubyではコロンは特別な意味を持つキャラクターです。他の人が書いたRubyのプログラムでコロンを見かけたら、それは特別な意図があってそこにコロンを使用したと考えてください。とはいえRubyのコロンが何か難しい処理で使われる訳ではありません。普通に使われる機能の1つです。
まずは、Rubyで使われるコロンの種類について紹介します。
前に付くか後ろに付くかで違う
他の人が書いたRubyのプログラムを読んでいると、コロン(:)が付いた文字列を見かけることがあるでしょう。しかし、それらは全て同じものとは限りません。コロン(:)が文字列の前につくか、後ろに付くかで意味が違います。
具体的には、文字列の前にコロン(:)が付いていたら、それはシンボルです。一方、文字列の後ろにコロン(:)が付いていたら、それはキーワード引数でしょう。それぞれ意味があるので、変数名にコロン(:)が付いていたら、付いている位置を注意して見てください。
Rubyの識別子で使える文字
Rubyの変数などの命名に使われる識別子は、英文字またはアンダースコア(_)から始まり、英文字,アンダースコア(_)または数字で構成されます。例えばローカル変数は、このルールが適用されるのでご存じの方が多いでしょう。
もし識別子にコロン(:)のような記号が使われている場合、それは通常の変数ではありません。Rubyの特別な機能を利用するためにコロン(:)が使われていると判断してください。
コロンが前に付く場合:シンボル
Rubyの識別子で文字列の前にコロンが付いている場合、それはシンボルです。シンボルは文字列と1対1で関連付けされるラベルのようなもので、ハッシュなどで使われます。次からシンボルの使い方を簡単に解説します。
Rubyのシンボルの使い方
Rubyのシンボルとは、先ほど紹介したように任意の文字列と一対一に対応するラベルのようなオブジェクトで、下記の例のようにコロン(:)と文字列で記述します。
シンボルの例
:key => "symbol"
シンボルの文字列の関係は、ハッシュのキーと値の関係と言えば、解りやすいのではないでしょうか。Rubyのハッシュとは他のプログラミング言語の連想配列に相当する機能で、ハッシュの添え字としてシンボルを指定すると、関連付けされている文字列が参照されます。
ハッシュの使用例
hash = { :key => "symbol" } p hash[;key] # "symbol”が表示される
シンボルの用途
Rubyでシンボルが使えるケースは多くありません。Rubyのプログラムでよく見かけるのは先ほど紹介したハッシュですが、その他にattr_accessorメソッドや __send__メソッドなどで使われます。
シンボルの用途
・ハッシュのキー (例:{ :key => “value” })
・アクセサの引数で渡すインスタンス変数名 (例:attr_accessor :title)
・メソッド引数で渡すメソッド名 (例:__send__ :to_s)
・Cのenum 的な使用
シンボルを使った例
次がハッシュとアクセサでシンボルを利用したRubyのプログラムの例です。
class Note attr_accessor :hash def initialize key, name @hash = {:key => key, :name => name } end def view_hash() str = @hash[:key] + " : " + @hash[:name] puts str end end obj = Note.new "MyKey", "MyName" p obj.hash[:key] # "MyKey"が表示される p obj.hash[:name] # "MyName"が表示される obj.view_hash() # MyKey : MyNameが表示される
上の例では、アクセサとして@hashをクラスの外から参照できるようにしています。また、Noteクラスをインスタンスした際に、initializeメソッドで引数をハッシュとして設定しています。そのため、クラスの外からハッシュを参照したり、クラスの中で利用できます。
コロンが後ろに付く場合:キーワード引数
Rubyのプログラムで文字列の後ろにコロンが付いている場合、それはキーワード引数です。キーワード引数は、メソッドに変数名を指定して値を引き渡す際に使われる便利な機能です。次からキーワード引数の使い方を簡単に解説します。
キーワード引数とは
通常のメソッドの引数は、宣言された順序で指定します。それに対してキーワード引数は、順序に関係なくキーに該当する値を引数とする方法です。キーワード引数を利用するには、メソッドを定義する際、コロン(:)を用いてキーと初期値のペアで引数を指定し、その処理ではキーを変数のように使います。
キーワード引数を用いたメソッドの定義
def メソッド名( キー: 初期値 )
キーを使った処理
end
キーワード引数を定義したメソッドを呼び出す場合、省略することが可能です。そして、もしキーワード引数を省略した場合は、メソッド内の処理で初期値が使われます。
キーワード引数の例
キーワード引数は、メソッドを呼び出す際に、コロン(:)を用いてキーと初期値のペアで指定するのが特徴です。なお、メソッドの処理では、先ほど紹介したシンボルとして使うのではなく、コロン(:)の付いてない変数として使います。
キーワード引数を利用したプログラムの例
def views( id:"none", name:"none" ) unless id.eql?("none") then puts id + " " + name end end views( id:"NO1001", name:"TEST")
注意したいコロンの使い方
違うプログラミング言語を学んだ方にとって、これまで紹介したRubyのコロンの使い方以外にも使えるのでは、と思われるかもしれません。残念ながらそのような使い方はできないので注意が必要です。次から他のプログラミング言語で使えるものの、Rubyでは使えないケースを紹介します。
Rubyのfor構文ではコロンは使えない
C言語とC言語の影響を受けたプログラミング言語では、繰り返し処理で使われるfor構文の中でコロン(:)が使われます。しかし、Rubyのfor構文では、コロン(:)は使いません。
Rubyのfor構文
for 変数 in オブジェクト do
実行する処理1
end
なお、配列を対象にした繰り返し処理をRubyで作る場合、eachメソッドなどの配列クラスに定義されたメソッドを利用できます。安易に繰り返し処理を作らずに、ぜひ、メソッドを使った記述を心がけてください。
SQLのプリペアドステートメントとの違いに注意
PHPやJavaなど他のプログラミング言語を経験された方は、文字列の前にコロン(:)が付いていると、SQLのプリペアドステートメントを連想される方もいるでしょう。
なおSQLのプリペアドステートメントとは、SQLにパスワードなどの文字を直接記載してSQLサーバーに送信するのではなく、変数を使ったSQLを先に送信し、後からその変数に対応する文字を送信する方法です。
PHPによるプリペアドステートメントの例
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value);
同じような書き方はRubyでも可能ですが、下記の例のように「?」を使います。
stmt = dbh.prepare('INSERT INTO REGISTRY (name, value) VALUES(?,?)') stmt.execute(name, value)
Rubyのコロン(:)から始まるシンボルを、SQLのプリペアドステートメントと混同しないでください。
まとめ
Rubyにおけるコロン(:)は特別な意味を持つ文字です。具体的にはRubyのログラムに使われる場合、今回紹介したようにシンボルまたはキーワード引数に使われます。なお、文字列の前にコロンが付いた場合はシンボルであり、文字列の後ろに付いた場合はキーワード引数です。そして、シンボルはハッシュやアクセサなどで利用されます。
Rubyは短い記述で読み易いプログラムが書けますが、今回紹介したコロン(:)のような記号に意味があり、これらを知らないとプログラムを読んでも理解できません。ぜひコロン(:)の使い方をマスターしてください。
Rubyのハッシュについて詳しく知りたい方は、下記の記事を参照してください。
【Ruby入門】ハッシュ(hash)とシンボルの基本
またアクセサについて詳しく知りたい方は、下記の記事を参照してください。
Rubyの基礎】インスタンス変数の基本とattr_accessorの使い方