前回のまでパーフィクトRubyは、1章から3章が終わった。
その段階でわからないところが以下のことである。
- 仮引数としてブロックを受けるところ
- Procオブジェトをブロックで渡す
- 例外処理
今回はここの復習と次の4章までやっていく。
##仮引数としてブロックを受ける
そもそも根本的にブロックが何かわからない。。。
なので、分解して理解していく。
###ブロックとは?
簡単に言うと、do~end(もしくは{~})で囲われた、引数となるためのカタマリ。
その中にyieldや変数が混ざったりしているが基本これだけ。
###ブロックの特徴
ブロック単体では存在することができなく、引数にしかなれない。
引数として渡されたブロックは、yieldによって実行される。
def block_name
yiled
end
block_name do
puts "Hello world"
end
# "block_name内でyiledによりHello worldが出力される"
簡略した、yieldを使わずに書くと以下の通り。
def block_name(&block)
block.call
end
block_name do
puts "Hello world"
end
# "Hello world"
def block_name(&block)
ではブロック引数が受け取ることを示している。
###&blockの【&】とは?
&をつけることで、引数にブロックが渡ってきたときに、Procオブジェクトに変換している。
##Procオブジェトをブロックで渡す
ブロックはわかったでもProcオブジェクトってなに?
これも分解して解釈する。
###Procオブジェクトとは?
ブロックをオブジェクト化したものがProc。
ブロックがそれ単体では存在できないことを思い出す (→オブジェクト化してしまえばok)
ブロックをオブジェクトに変換することで、引き渡されたメソッド(block_name)内で扱えるようにする
Procオブジェクトは、callで呼び出すことが出来る
block.call
の正体はこれ。
つまり、引数にブロックを受け取るメソッドに対して、ブロックの代わりにProcオブジェクトを渡すことができるということ。
普通の引数も渡せるがブロックも引数として渡せるなんて便利ですね。
以上が前回わからなかったところの復習。
次に第4章についてアウトプットしていきます。
##4章 クラスとモジュール
ここではクラスについて概念や記述の方法について書いてあります。
クラスはある程度しっているので問題ないでしょう。
###クラスメソッド・インスタンスメソッドとは?
クラスメソッドとは、クラスオブジェクトから実行可能なメソッド
インスタンスメソッドとは、クラスのインスタンス(実体)に対して紐づけられるメソッド
引用元:コトバンク
なるほどさっぱりわかりません。
とりあえずコードをかいてみます。
class Language
def program(name)
name
end
end
program("ruby")
実行結果はundefined method 'program' for Add:Class (NoMethodError)
とでた
これはクラスに中にインスタンスがあるので、「どこのprogramですか」となっている。
そのためクラスを指定してあげないといけない。
class Language
def program(name)
name
end
end
Language.program("ruby")
これでどうだ!
実行結果はundefined method 'program' for Language:Class (NoMethodError)
これでもエラー。
この原因は箱を作ってあげないのでクラス.newをしてからの箱に代入する。
なので、
class Language
def program(name)
name
end
end
language=Language.new
puts language.program("ruby")#ruby
これでruby
で出力された。
###つまりインスタンスメソッドは?
結論から言うとクラスの中にメソッドを作成するとそれがインスタンスメソッドになる。
class クラス名
def メソッド名(変数1, 変数2, ...)
処理
end
end
インスタンスメソッドは、クラスのインスタンスに機能として搭載されているものです。
先ほどの計算クラス(エラー)となってしまったコードは、インスタンスを作り、作ったインスタンスに対してメソッドを呼び出せばエラーを吐きません。
###クラスメソッドは?
クラスメソッドの定義に仕方としては
class Language
def self.program(name)
name
end
end
puts Language.program("ruby")
という形で定義します。
クラスメソッドの使い方としては、クラス名.メソッド という形で使います。
上記の例ですと
Language.program
という感じになる。
###今回はここまで、
毎日アプトプットするのはプログラミングの勉強になりますが
、記事を作成に少し時間がかかってしまうので、今後はそこを改善したいです。
第4章の始めなので、しっかりRubyの構文になれていきたいですね。
また、gitのコマンド操作も今日は色々やらかしたので、gitの操作も慣れてきたいと思います。
周りに優秀なエンジニアがいる環境にいるのでガンガン聞いて、インプット、アウトプットしてきたいです。
今日の名言
考えて、答えが出ることなら、しっかり考えましょう。考えても仕方のないことなら、意識的に考えるのをやめましょう。
石塚巌(実業家)