英文学生の日常

業務日誌.tomo

業務で感じたことをひたすら綴る

Ruby 備忘録①

クラスとインスタンス

・クラスとインスタンスは、下記の様に設計図と設計図から作成される実物体と言われています。 引用元(https://pikawaka.com/ruby/class

クラスとインスタンスのイメージ

たい焼きと型 

メソッド

# 引数を追加
def say_hello(name)
  puts "#{name}, hello!"
end

# say_helloメソッド実行
say_hello("mari")
#=> mari, hello!

 

インスタンスメソッド

インスタンスメソッドとは、作成したインスタンスから実行出来るメソッドのことです。

先ほど作成したanko_taiyakiのインスタンスは、initializeメソッドでインスタンス変数に「@taste = あんこ, @price = 250」を代入した為、この情報を保持しています。

インスタンスメソッドは、このインスタンスごとに保持している情報を使って処理を書くことが出来ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# たい焼きの設計図を作成
class Taiyaki

  # インスタンス作成の時に実行される
  def initialize(taste, price)
    @taste = taste
    @price = price
  end

  # 作成したインスタンスから実行出来るインスタンスメソッド
  # インスタンスによって、@tasteと@priceの値が異なる
  def show_info
      puts "#{@taste}味のたい焼きは#{@price}円です。"
  end
end

# anko_taiyakiのインスタンスを作成
anko_taiyaki = Taiyaki.new("あんこ", 250)
#=> <Taiyaki:0x007fd9489cdb18 @taste="あんこ", @price=250>


# 作成したanko_taiyakiのインスタンスからshow_infoインスタンスメソッドを実行する
anko_taiyaki.show_info
# => あんこ味のたい焼きは250円です。

 

・クラスメソッド

先ほどのインスタンスメソッドは、インスタンスから呼び出すことが出来ましたが、その他にもクラスから呼び出すことが出来るクラスメソッドがあります。

クラスメソッドとは、インスタンスに依存せずにクラス本体に紐づけられるメソッドのことです。
インスタンスの持つデータを使う必要のない処理は、クラスメソッドで定義します。

 

・クラス変数

インスタンス変数の他に、クラス変数という@が2つ付く変数があります。
インスタンス変数が作成された各インスタンスごとに共有される変数だったのに対して、クラス変数は、全てのインスタンスで共有される変数です。

 クラス変数の説明

 

クラスメソッドとクラス変数を追加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# たい焼きの設計図を作成
class Taiyaki

  # 全てのインスタンスで共有されるクラス変数
   @@total_taiyaki_count = 0

  # インスタンス作成の時に実行される
  def initialize(taste, price)
    @taste = taste
    @price = price

    # インスタンスが作成(new)される毎にカウントアップ
    @@total_taiyaki_count += 1
  end

  # インスタンスメソッド
  def show_info
      puts "#{@taste}味のたい焼きは#{@price}円です。"
  end

  # クラスメソッド
   def self.show_all_count
     puts "たい焼きは全部で#{@@total_taiyaki_count}個作成されました。"
   end

end
インスタンス作成してクラスメソッドを実行する
1
2
3
4
5
6
7
8
9
10
11
# anko_taiyakiのインスタンスを作成(カウントアップされる)
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x007fd9489cdb18 @taste="あんこ", @price=250>

# カスタード味のたい焼きを作成する(カウントアップされる)
custard_taiyaki = Taiyaki.new("カスタード", 300)
# => <Taiyaki:0x007fd9489b6f58 @taste ="カスタード", @price=300>

# たい焼きの個数を調べるためにshow_all_countクラスメソッドを実行する
Taiyaki.show_all_count
#=> たい焼きは全部で2個作成されました

 

eachメソッド

eachメソッドとは配列の中身を一つずつ取り出すメソッドです

eachメソッドの構文 

配列とは、一つのオブジェクトを複数の値を格納できる便利なものでしたね。
eachメソッドとはその一つ一つ格納されたオブジェクトを取り出すことが出来るメソッドです。

1
2
3
4
5
6
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
array.each do |element| # elementという変数に配列の要素が1つずつ格納されます。
  puts element
end
# eachメソッドの返り値
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

ハッシュ

 

 ・シンボル

シンボルはSymbolクラスのオブジェクトで、文字列はStringクラスのオブジェクトです。

シンボルは表面的には文字列と似ていますが、シンボルの中身は文字列とは違い整数で管理されています。その為、文字列よりも高速に処理出来ます。

シンボルは、「同じシンボルであれば同じオブジェクト」という特徴があります。実際に、オブジェクトのidを調べる「object_idメソッド」を使って見ていきましょう。

1
2
3
4
5
6
7
8
9
# 文字列は、同じ文字列でもオブジェクトidが違う
'pikawaka'.object_id => 70151245202480
'pikawaka'.object_id => 70151245128760
'pikawaka'.object_id => 70151248681680

# シンボルは同じシンボルであればオブジェクトidが同じ
:pikawaka.object_id => 1310428
:pikawaka.object_id => 1310428
:pikawaka.object_id => 1310428

ブロック

ブロックとは、一言で言えば、「引数のかたまり」です。

ブロックの、do~end までの範囲すべてが引数です。

または、{ } で囲まれた範囲もブロックで、この範囲すべてが引数です。

ブロックとはどのようなものなのか、ここで簡単に復習してみましょう。

サンプルコード(do~endのブロックの例):

  1. 3.times do | i |
  2. x = i * 2
  3. p x
  4. end

サンプルコードの実行結果:

  1. 0
  2. 2
  3. 4

上の例の、

"do | i |
  x = i * 2
  p x
end"

までが、ブロックです。
このブロックが、timesメソッドに引数として、与えられています。

timesメソッドは、このブロックを引数として受け取り、0、1、2と数え上げる時に、数え上げている数を変数iに入れて、引数として受け取ったブロックのコードを実行しています。

そしてブロック内で「p x 」が実行されて、画面に実行結果が表示されています。

サンプルコード( { } のブロックの例):

  1. [ "one", "two", "three" ].each { | n |
  2. str = "this num is " + n
  3. p str
  4. }

サンプルコードの実行結果:

  1. "this num is one"
  2. "this num is two"
  3. "this num is three"

eachメソッドも、

"{ | n |
  str = "this num is " + n
  p str
}"

というブロックを、引数として受け取っています。

eachブロックは、"one"、"two"、"three"と配列をループする時に、ループ中の配列の要素を変数nに入れて、引数として受け取ったブロックのコードを実行しています。

そして、ブロックで、「p str」が実行されて画面に実行結果が表示されています。

このように、ブロックはコードではありますが、あくまで引数なので、単体では存在できません。

配列

%w()の中にスペースで区切って文字列を並べると、配列を簡潔に記述できます。次の2行は同じ結果になります。文字列の中で式展開やバックスラッシュ記法を使いたいときは、大文字の%W()を使います。()は、<>のように好きな記号を使えます。animals=["dog","cat","elephant"]animals=%w(dogcatelephant)

黒田努,佐藤和人. 改訂4版 基礎Ruby on Rails (基礎シリーズ) (Japanese Edition) (Kindle の位置No.1354-1358). Kindle 版.