0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

パーフェクトRubyをひたすらやってみた。(アウトプット用)#2

Last updated at Posted at 2020-03-02

前回のまでパーフィクト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の操作も慣れてきたいと思います。

周りに優秀なエンジニアがいる環境にいるのでガンガン聞いて、インプット、アウトプットしてきたいです。

今日の名言

考えて、答えが出ることなら、しっかり考えましょう。考えても仕方のないことなら、意識的に考えるのをやめましょう。

石塚巌(実業家)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?