Rubyにおけるオブジェクト・変数と定数入門

Rubyにおけるオブジェクトとは何か・オブジェクトの種類などを解説していきます。また、変数や定数についても学びましょう。

 

吉田先生

初心者の方もこのレッスンでRubyのオブジェクト・変数と定数の基礎を身につける事が出来ます!


 

Rubyにおけるオブジェクトとは

オブジェクトとは一言でいうと「データ」となります。Rubyではデータの基本的単位をオブジェクトとしているのです。

*オブジェクトはインスタンスとも呼ばれます。

種類(オブジェクト)

オブジェクトにはたくさんの種類が存在します。その中から代表的なものをいくつか挙げていきます。

文字列オブジェクト

画像の例の様に、文字からなるオブジェクトを文字列オブジェクトと呼びます。例で言えば「Hello」も「ありがとう」も「太陽」も、これらの文字列は全てオブジェクト(文字列オブジェクト)という事です。

数値オブジェクト

画像の様に、数からなるオブジェクトを数値オブジェクトと呼びます。数値オブジェクトには、数式を表すものなども存在します。

配列オブジェクト

配列オブジェクトとは、いくつかのオブジェクト(データ)をまとめたものになります。画像の例だと、[ 1,2,3 ] は数値オブジェクトであるそれぞれの要素をカンマ(,)で区切り順番に並べ、それらを [ ] で括っています。

下記の例は数値オブジェクトの集まりでしたが、色々な種類のオブジェクトが混ざった配列も作ることが出来ます。では、配列を実際に作ってみましょう!例えば

array = [1, "雨", "雲", 5]
p array
#=> [1, "雨", "雲", 5]

 

複数の種類のオブジェクトからなる配列ができました。また、配列からオブジェクトを取り出したり、既存の配列にオブジェクトを入れたりすることもできる他、[ ] とだけ書けば、中身が空の配列オブジェクトを作ることもできてしまいます。

これらのオブジェクトはクラスというものに属しています。様々なオブジェクトの一つ一つが、どのような性質を持つのかを定義しているのはクラスという事になります。また、オブジェクトはメソッドというものを使う(実行する)事ができます。では実際みなさんもテキストエディタを使ってやってみましょう。

"こんにちは"
String.new("こんにちは")
"こんにちは".class
  #=> String

まず始めに、文字列オブジェクトを作成しています。文字列オブジェクトは「"」ダブルクオーテーションで文字列を囲う事で、2番目のコードを実行した結果と同じ結果を得る(文字列オブジェクトの作成)事ができてしまいます!この「"こんにちは"」という文字列オブジェクトも先ほど説明したように何らかのクラスに属しているのです。

どのクラスに属しているのか調べたいときは、「class」というメソッドを使います。そうするとStringという結果になりますね。これは、文字列オブジェクトである「"こんにちは"」はStringというクラスに属している(Stringクラスのインスタンス)であることを表しています。

Rubyにおける変数

オブジェクトに付けられる、ラベル(名札)の様なものです。

オブジェクトに名前の書いた名札を付けるには、

変数名 = オブジェクト 

という書き方をします。イコールが書かれていますが、数学などの式の様に左辺と右辺が等しいという事を表しているのではありません。Rubyにおいては、左辺に右辺を代入するという事を表しているのです。

つまり、変数名とオブジェクトは等しいのではなく、変数名(変数)にオブジェクトを代入しているという事になります。Rubyにおいては、4種類の変数が存在します。

  1. ローカル変数(局所変数)
  2. グローバル変数(大域変数)
  3. インスタンス変数
  4. クラス変数

上記4種類の内、どの種類の変数に分類されるのかは変数名で判断します。具体的に何をもって判断するのかというと、変数名の1文字目(先頭の文字)の部分です。

ローカル変数

「 _ 」アンダースコア or アルファベットの小文字

グローバル変数

「$」ドル記号

インスタンス変数

「@」アットマーク

クラス変数

「@@」

これらの規則に従って、値(オブジェクト)がどういった内容のものであるのかを分かりやすく識別できるような名前を付けます。例えば、人物名の文字列オブジェクトであれば

p names = "yamada"
 #=> "yamada"  

というような付け方になります。

疑似変数

ここまで4種類の変数を挙げましたが、この他にも「疑似変数」というものがあります。代表的なものをいくつか挙げてみましょう。

  • nil
  • true
  • false
  • self

など。

これら疑似変数は、値を変更することはできません。では、試しにnilという疑似変数の値に何か代入してみましょう。

nil = 1
#=> SyntaxError: (irb):1: Can't assign to nil
#nil = 1

代入しようとすると構文エラー:Can't assign、割り当てる事が出来ないと書かれていますね。

種類(変数)

ローカル変数

ローカル変数とは、決められた有効範囲の中で使用することが可能な変数です。この有効範囲という言葉は、変数のスコープという呼ばれ方もします。ですので、ローカル変数の「ローカル」というのは変数のスコープがローカルなためという事になります。

上記画像でいいますと、特定の場所で「 x = 10 」と 10 を x という変数に代入しています。しかし、これはローカル変数であるので、定義した場所以外(有効範囲外)では、使用不可となります。または、違う変数として扱われる場合もあります。

上記画像では、AとBの2つの場所があり、それぞれの中で同じ文字である「 x 」に異なる数字を代入しています。これらは、異なる変数として扱われるのです。では、確認してみましょう。

hensu.rb

#A
x = 10  #変数x10を代入
p x  #変数xを呼び出し
 #=>10
puts x + 1 #変数x+1の結果をputsというメソッドで出力
 #=>11
puts x + x
 #=>20
x.class
 #=>FIxnum

hensu2.rb

#B
p x  #Aで定義した変数xを呼び出し
 #=>hensu2.rb:1:in `<main>': undefined local variable or method `x' for main:Object (NameError)
Did you mean?  x

x = 5  #変数x5を代入
p x

hensu2.rb

#p x  #Aで定義した変数xを呼び出し
x = 5  #変数x5を代入
p x
 #=>5

まず上記画像のAのエリアに当たるirbで変数xを定義します。Aのirbでは、変数xを呼び出すことも、変数xを使った足し算もできます。ちなみにですが、classメソッドで変数xのクラスを調べると、Fixnum(整数)になっていますね。

そして、Bのエリアに移ります。BのエリアでAで定義した変数xを呼び出してみると、エラーなってしまいます。それでは、Aで定義した変数xとは異なる変数として、Bで変数xを定義してみましょう。

まず1行目の変数「x」の呼び出しを先頭に「#」をつけコメントアウトし、5を代入してみました。そして、再度変数xを呼び出してみると、呼び出しに成功していることが分かりますね!

グローバル変数

先程の局所的(ローカル)変数とは、反対の変数がグローバル変数です。グローバル変数はどんな場所であっても使用することが出来るのでプログラム全体がスコープ(有効範囲)となります。

一見便利そうなグローバル変数ですが、有効範囲の広さゆえに大きなプログラム等ではグローバル変数を使用することにより複雑化してしまい、修正等が大変になるため使用頻度は低いかと思われます。

インスタンス変数 / クラス変数

これら2つの変数はクラスを定義する際に使われる変数です。クラスについての章で詳しく学んでいきたいと思います。

定数

定数とは、変数と同じくオブジェクトに付けることのできるラベル(名札)の様なものです。では、変数とは何が違うのかというと、

変数

一度値を代入し、その後値を変更することができる

定数

使用頻度の高い、変更の必要がない値を代入するもの(再代入不可)

定数も変数と同じように

定数名 = オブジェクト

の形で定義します。

class Sample
  BIRTH_PLACE = "tokyo"
end

上記例の様に、定数にも規則があり先頭(1文字目)が、アルファベット(大文字)で始まらなければなりません。また慣習的には全ての文字を大文字にするようなので「テスト」という定数を定義する場合は test や Test ではなく TESTとなります。区切る場合には「_」アンダースコアで区切ります。

定数について冒頭で再代入不可と申し上げました。では、定数は絶対に値を変更できないかというとそうではなく、変更しようとするとまず警告が出ます。しかし、警告は出るものの値は変更されてしまうようになっているのでご注意ください。

参照する

puts BIRTH_PLACE
#NameError: uninitialized constant BIRTH_PLACE

puts Sample::BIRTH_PLACE
 #tokyo

定数の参照の仕方には決まりがあります。上記ではクラス内にて定数が定義されています。このような場合、puts BIRTH_PLACE としてもエラーになり参照できません。ですので、

クラス名  ::  定数名

という形で参照しなければなりません。では、クラス外で定義した場合にはどのように参照するかというとクラス外で定義した場合は、objectクラスに属しますので

object  ::  定数名

となります。または、object は省略可能ですので

::  定数名

とすることも可能です。

まとめ

オブジェクトとはデータのことを指します。オブジェクトには様々な種類があり(文字列・数値・配列など)変数とはオブジェクトに付ける名札の様なものです。

変数は、ローカル・グローバル・インスタンス・クラス変数という4種類の変数が存在します。定数とは変数と同じく名札の様なものだが変数とは違い使用頻度の高い、変更の必要がない値を代入するものです。

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×