あまブログ

ドキドキ......ドキドキ2択クイ〜〜〜〜〜〜〜ズ!!

【書籍まとめ】ゼロからわかるRuby超入門

ゼロからわかる Ruby 超入門

2章 オブジェクトと変数

  • オブジェクト
    • Rubyの世界での「もの」
    • 整数オブジェクト→1
    • 少数オブジェクト→2.0
    • 文字列オブジェクト→"hello"
  • 変数
    • オブジェクトにつける名札
    • 変数へ代入
      • 変数 = オブジェクト
    • 変数名の付け方
      • 全て小文字
      • 2単語以上はスネークケース(例:my_order)
  • 式展開
    • #{計算式}
    • #{変数}
  • 定数
    • 先頭が大文字
    • 2回代入するとwarning
  • コメント
    • 行頭に#
    • 行の途中からでも可
    • =begin=endで囲むと複数行コメント(行頭からのみ)
  • binding.irb
    • プログラムの途中で一時停止してirbを使う
    • Ruby2.4ではrequire "irb"が必要(Ruby2.5以降では不要)
  • pメソッド
    • デバッグ用
    • 変数の中身を表示する(putsメソッドとほぼ同じ)

3章 処理の流れを変える

4章 配列

  • 配列とは
    • オブジェクトをまとめて扱う部品
    • 配列自身もオブジェクト
    • 配列はArrayクラスのオブジェクト
    • 配列を代入する変数名は複数形にする
  • 要素の取得
    • 配列名[0]=配列名.first→先頭の要素を取得
    • 配列名[-1]=配列名.last→後ろから1番目(末尾)の要素を取得
  • 要素の追加
    • pushメソッド
      • 配列名.push(オブジェクト)→配列の末尾に要素を追加
      • 配列名 << オブジェクトでも可
    • unshiftメソッド
      • 配列名.unshift(オブジェクト)→配列の先頭に要素を追加
  • 要素の削除
  • Rangeオブジェクト(範囲オブジェクト)
    • (3..5)
  • eachメソッド
    • break→繰り返しを途中で終わらせる
    • next→繰り返しの次の回に進む
## eachメソッド
配列.each do |変数|
  繰り返し実行する処理
end

5章 配列の便利なメソッド

  • sizeメソッド
    • 配列の長さを返す。
    • p [1, nil, 3, nil].size #=> 4
  • sumメソッド
    • 要素の合計を返す。
    • p [1, 2, 3].sum #=> 6
  • uniqメソッド
    • 配列から重複した要素を取り除いた新しい配列を返す。
    • p [1, 4, 1].uniq # => [1, 4]
  • sampleメソッド
    • 配列の要素を1個ランダムに選んで返す。
  • shuffleメソッド
    • 配列の要素をランダムシャッフルして、配列として返す。
  • sortメソッド
    • 配列の内容をソートする。
    • 数字なら昇順。文字ならabc順。
  • reverseメソッド
    • 要素を逆順に並べた新しい配列を生成して返す。
  • joinメソッド
    • 配列の要素を指定した文字列を間に挟んで連結した文字列を返す。
    • p [1, 2, 3].join('-') #=> "1-2-3"
  • mapメソッド
    • 各要素に対してブロック中の処理で変換した配列を返す。
    • p ["abc", "123"].map{|text| text.reverse} # => ["cba", "321"]
    • p ["abc", "123"].map(&:reverse) # => ["cba", "321"]

  • object_idメソッド
    • 各オブジェクトに対して一意な整数(オブジェクトID)を返す。
  • splitメソッド
    • 文字列を区切り文字で分割して配列にする。
    • p "a-b-c".split("-") →["a","b","c"]
  • メソッドチェーン
    • メソッドをつなげて書く方法
    • p [4,2,8].sort.reverse #=> [8,4,2]
  • 末尾に!がつくメソッド
    • 対象のオブジェクトを破壊的に変更するものが多い
  • 引数
    • メソッドへ渡すオブジェクト

6章 ハッシュ

6.1 ハッシュとシンボル

6.1.1 ハッシュ

  • ハッシュ(Hash)とは
    • 「キー」と「値」のセットで複数のデータを扱う入れ物
    • ハッシュはHashクラスのオブジェクト
  • ハッシュの書き方
    • キーがシンボルの時
      • {キー: 値, キー: 値}
    • キーがシンボル以外の時(シンボルにも使える)
      • {キー => 値, キー => 値}

ハッシュのキーから値を取得

## ハッシュのキーから値を取得
menu = {coffee: 300, caffe_latte: 400}
p menu[:coffee] #=> 300

ハッシュへキーと値の組を追加

## ハッシュへキーと値の組を追加
menu = {coffee: 300, caffe_latte: 400}
menu[:mocha] = 400
p menu #=> {:coffee=>300, :caffe_latte=>400, :mocha=>400}

6.1.2 シンボル

  • シンボル(Symbol)とは
    • 文字列と似てるオブジェクト
    • シンボルはSymbolクラスのオブジェクト
  • シンボルの書き方
    • :symbol
  • to_symメソッド
    • 文字列をシンボルに変換する。

6.2 ハッシュの繰り返し処理

## ハッシュの繰り返し処理
menu = {"コーヒー" => 300, "カフェラテ" => 400}
menu.each do |key, value| # ハッシュのeachメソッドではブロックの中での変数は2つ
  puts "#{key}#{value}円です"
end

7章 メソッド

メソッドとは「処理のかたまりを部品化して名前をつけたもの」

7.1 メソッドの基礎

  • メソッドは最後の実行結果が戻り値として呼び出し元へ返る
  • メソッドの戻り値は変数に代入することもできる
## メソッド定義とメソッド呼び出し

# メソッドを定義する
def area
  puts 2 * 2
end

# メソッドを呼び出す
area #=> 4
## メソッドの戻り値

def area
  2 * 2 # メソッドの最後の実行結果4が戻り値として呼び出し元へ返る
end

puts area #=> 4

7.2 メソッドへオブジェクトを渡す(引数)

引数はメソッドへオブジェクトを渡す機能⇄戻り値はメソッドから呼び出し元へオブジェクトを返す機能

## 引数を持つメソッドの定義と呼び出し

def area(x)
  x * x
end

puts area(2) #=> 4
## 2つ以上の引数を持つメソッドの定義と呼び出し

def area(x, y)
  x * y
end

puts area(2, 3) #=> 6
## 引数にデフォルト値を指定したメソッドの定義と呼び出し

def order(item = "コーヒー") # itemのデフォルト値に"コーヒー"を指定
  "#{item}をください"
end

puts order #=> コーヒーをください
puts order("カフェラテ") #=> カフェラテをください
## 引数にキーワード引数を指定したメソッドの定義と呼び出し

def order(item:, size:) # 引数名の後ろに:をつけるとキーワード引数になる
  "#{item}#{size}サイズでください"
end

puts order(item: "カフェラテ", size: "ベンティ") #=> カフェラテをベンティサイズでください

## キーワード引数にデフォルト値を指定したメソッドの定義と呼び出し

def order(item:, size: "ショート") # sizeのデフォルト値に"ショート"を設定
  "#{item}#{size}サイズでください"
end

puts order(item: "カフェラテ") #=> カフェラテをショートサイズでください
puts order(item: "カフェラテ", size: "ベンティ") #=> カフェラテをベンティサイズでください

7.3 メソッドを途中で終わらせる(return)

  • return
    • メソッドの処理を終了し、呼び出し元に戻る
    • return <オブジェクト>で戻り値を指定できる
## returnの例

def thanks_and_receipt
  puts "ありがとうございました。"
  return # ここでメソッドが終わる
  puts "こちら、レシートになります。" # この行は実行されない
end

thanks_and_receipt #=> ありがとうございました。
## returnに戻り値を指定

def thanks_and_receipt(receipt)
  greeting = "ありがとうございました。"
  unless receipt # receiptがfalseのときに次の行を実行
    return greeting # returnを実行し、変数greetingに代入されたオブジェクトを戻り値にする
  end
  greeting + "こちら、レシートになります。"
end

puts thanks_and_receipt(true) #=> ありがとうございました。こちら、レシートになります。
puts thanks_and_receipt(false) #=> ありがとうございました。

7.4 ローカル変数のスコープ

## メソッド内で定義したローカル変数は、メソッドの外からは見えない

def hello
  text = "こんにちは"
end

hello
p text #=> エラー
## メソッドの外で定義したローカル変数は、メソッドの中からは見えない

text = "こんにちは"

def hello
  p text
end

hello #=> エラー
  • メソッドの中で必要なオブジェクトは引数を使って渡す

8章 クラス

8.1 クラスとは

  • クラスとは
    • オブジェクトの種族を表すもの
    • 全てのオブジェクトはいずれかのクラスに属す
    • クラスは定数
    • クラスはClassクラスのオブジェクト
  • インスタンス
    • クラスから生成されたオブジェクトのこと
    • あるクラスに属するオブジェクトをそのクラスのインスタンスと言う
## クラスからオブジェクト(インスタンス)を生成する
p String.new #=> ""
p String.new("カフェラテ") #=> "カフェラテ"

8.2 クラスを定義する

  • クラス名の書き方
    • 先頭は大文字
    • 2単語以上はキャメルケース
## クラスを定義する
class Drink
end

drink = Drink.new
p drink.class #=> Drink

8.3 クラスにメソッドを定義する

## クラスにメソッドを定義する
class Drink
  def name
    "カフェラテ"
  end
end

drink = Drink.new
puts drink.name #=> カフェラテ # クラスに定義したメソッドを呼び出す
  • メソッドの呼び出し
    • オブジェクト.メソッド(クラス定義の外側でのメソッド呼び出し)
  • レシーバ
    • メソッドが呼び出されるオブジェクトのこと
    • 2.even?の場合、2がeven?メソッドのレシーバ
  • methodsメソッド
    • そのオブジェクトに対して呼び出せるメソッド名の一覧を返す
## クラスの中で同じクラスのメソッドを呼び出す
class Drink
  def name
    "モカ" + topping # "モカ" + self.toppingとも書ける
  end
  def topping
    "エスプレッソショット"
  end
end

drink = Drink.new
puts drink.name #=> モカエスプレッソショット
  • クラスの中でメソッドを呼び出す時はレシーバを省略してメソッド名だけで呼び出せる(self.メソッド名でも可)

8.4 インスタンス変数

8.4.1 インスタンス変数とは

  • 名前が@で始まる変数(例:@name)
  • インスタンス(オブジェクト)ごとに存在する変数
  • 同じオブジェクトであれば複数のメソッドをまたいで使うことができる
  • 代入が実行された時に生成される
## インスタンス変数を使った例
class Drink
  def order(item)
    puts "#{item}をください"
    @name = item
  end
  def reorder
    puts "#{@name}をもう1杯ください"
  end
end

drink = Drink.new
drink.order("カフェラテ") #=> カフェラテをください
drink.reorder #=> カフェラテをもう1杯ください
## インスタンス変数はオブジェクトごとに存在する
class Drink
  def order(item)
    puts "#{item}をください"
    @name = item
  end
  def reorder
    puts "#{@name}をもう1杯ください"
  end
end

drink1 = Drink.new
drink2 = Drink.new
drink1.order("カフェラテ") #=> カフェラテをください
drink2.order("モカ") #=> モカをください
drink1.reorder #=> カフェラテをもう1杯をください
drink2.reorder #=> モカをもう1杯ください

8.4.2 インスタンス変数を取得するメソッド

## インスタンス変数を取得するメソッド
class Drink
  def order(item)
    puts "#{item}をください"
    @name = item
  end
  def name
    @name
  end
end

drink = Drink.new
drink.order("カフェラテ") #=> カフェラテをください
puts drink.name #=> カフェラテ

8.4.3 インスタンス変数へ代入するメソッド

## インスタンス変数へ代入するメソッド
class Drink
  def name=(text)
    @name = text
  end
  def name
    @name
  end
end

drink = Drink.new
drink.name= "カフェオレ" # drink.name = "カフェオレ"とも書ける
puts drink.name #=> カフェオレ
  • drink.name = "カフェオレ"のように書くのが一般的
    • インスタンス変数へ代入することを感覚的に分かりやすく示す
    • drink.name"カフェオレ"を代入しているのではなく、drinkオブジェクトのname=メソッドを呼び出し、引数として"カフェオレ"を渡している

8.4.4 インスタンス変数は代入が実行された時に生成される

class Drink
  def order(item)
    @name = item
  end
end

drink = Drink.new
drink.order("カフェラテ") # この時点でインスタンス変数が生成される
p drink.instance_variables #=> [:@name]

8.4.5 インスタンス変数の初期値を設定する

## initializeメソッドでインスタンス変数の初期値を設定する
class Drink
  def initialize
    @name = "カフェラテ"
  end
  def name
    @name
  end
end

drink = Drink.new
puts drink.name #=> カフェラテ
## initializeメソッドに引数を渡す
class Drink
  def initialize(name)
    @name = name
  end
  def name
    @name
  end
end

drink1 = Drink.new("カフェラテ")
drink2 = Drink.new("コーヒー")
drink3 = Drink.new("モカ")

puts drink1.name  #=> "カフェラテ"
puts drink2.name  #=> "コーヒー"
puts drink3.name  #=> "モカ"
  • initializeメソッド
    • newメソッドで新しくオブジェクトが生成された時に自動で呼び出される
    • newメソッドを呼び出す時に渡した引数が、initializeメソッドの引数として渡される

8.5 インスタンスメソッドとクラスメソッド

  • インスタンスメソッド
    • インスタンスをレシーバとするメソッド(user.name2.even?など)
    • 定義方法→def メソッド名
    • 呼び出し方法→インスタンス.メソッド
    • インスタンスメソッドからクラスメソッドを呼び出すことができる
    • ドキュメントでの記法→クラス名#メソッド名
  • クラスメソッド
    • クラスをレシーバとするメソッド(User.newなど)
    • 定義方法→def self.メソッド名
    • 呼び出し方法→クラス.メソッド
    • クラスメソッドからインスタンスメソッドを呼び出すことはできない(レシーバのインスタンスを決められないため)
    • ドキュメントでの記法→クラス名.メソッド名またはクラス名::メソッド名
## クラスメソッドを定義する
class クラス名
  def self.メソッド名
  end
end

# または

class クラス名
  class << self
    def メソッド名
    end
  end
end
## 同じクラスのクラスメソッドを呼び出す
class Cafe
  def self.welcome
    "いらっしゃいませ!"
  end
  def self.welcome_again
    welcome + "いつもありがとうございます!" # self.welcomeまたはCafe.welcomeでも可
  end
end

puts Cafe.welcome_again #=> "いらっしゃいませ!いつもありがとうございます!"
  • クラスメソッドの中で同じクラスのクラスメソッドを呼ぶときは、インスタンスメソッドのときと同じように、メソッド名だけを書けばOK(上記におけるwelcome)
  • レシーバを省略しない形で書くとself.クラスメソッド名またはクラス名.クラスメソッド名(上記におけるself.welcomeまたはCafe.welcome)

8.6 クラスの継承

  • 継承元のクラスをスーパークラス(親クラス)と呼ぶ
  • 継承先のクラスをサブクラス(子クラス)と呼ぶ
    • 子クラスは親クラスの全てのメソッドを使える
  • 親子のクラスで同名のメソッドがある場合、自分のクラスのメソッドが呼ばれる
    • 正確には継承関係を親へ親へとたどっていって、最初に該当したメソッドを呼び出す
  • superを使うと親クラスの同名メソッドを呼び出せる

8.6.1 クラスの継承

## クラスの継承
class サブクラス名 < スーパークラス名
end
## Itemクラスを継承してDrinkクラスを定義する
class Item
  def name
    @name
  end
  def name=(text)
    @name = text
  end
end

class Drink < Item
  def size
    @size
  end
  def size=(text)
    @size = text
  end
end

item = Item.new
item.name = "マフィン"

drink = Drink.new
drink.name = "カフェオレ"
drink.size = "tall"
puts "#{drink.name} #{drink.size}サイズ" #=> カフェオレ tallサイズ

8.6.2 クラスの継承関係を表示

## クラスの継承関係を表示
p Integer.ancestors
 #=> [Integer, Numeric, Comparable, Object, Kernel, BasicObject]
p Array.ancestors
 #=> [Array, Enumerable, Object, Kernel, BasicObject]
p Class.ancestors
 #=> [Class, Module, Object, Kernel, BasicObject]
  • ancestorsメソッド
    • クラスの継承関係を表示(親クラスとincludeしているモジュールを表示)

8.6.3 親クラスのメソッドを呼び出す - super

## 親クラスのメソッドを呼び出す super
class Item
  def name
    @name
  end
  def name=(text)
    @name = text
  end
  def full_name
    @name
  end
end

class Drink < Item
  def size
    @size
  end
  def size=(text)
    @size = text
  end
  def full_name
    super
  end
end

drink = Drink.new
drink.name = "カフェオレ"
drink.size = "tall"
puts drink.full_name #=> カフェオレ
  • super
    • オーバーライドしたメソッドの中でsuperを使うと親クラスの同名メソッドを呼び出せる
  • オーバーライド
    • 親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義してメソッドを上書きすること

8.7 メソッドの呼び出し制限

  • public
    • レシーバ指定の形式で呼び出せる(クラス定義の外から)
    • レシーバを省略した形式で呼び出せる(クラス定義内のメソッドの中から)
  • private
    • レシーバを省略した形式のみ呼び出せる(クラス定義内のメソッドの中から)
## publicなメソッドとprivateなメソッド
class Cafe
  def staff
    makanai
  end
  private # 以降で定義するメソッドをprivateなメソッドにする
  def makanai
    "店員用スペシャルメニュー"
  end
end

cafe = Cafe.new
puts cafe.staff #=> 店員用スペシャルメニュー
puts cafe.makanai #=> NoMethodError

9章 モジュール

  • モジュールとは「メソッドを共同利用するための部品」
  • モジュールにはインスタンスメソッド、クラスメソッド、定数を定義できる

9.1 モジュールを使ってメソッドを共同利用する手順

## 1.モジュールを定義する
module WhippedCream
end
## 2.モジュールにメソッドを定義する
module WhippedCream
  def whipped_cream
    @name += "ホイップクリーム"
  end
end
## 3.モジュールのメソッドをクラスで使う
module WhippedCream
  def whipped_cream
    @name += "ホイップクリーム"
  end
end

class Drink
  include WhippedCream
  def initialize(name)
    @name = name
  end
  def name
    @name
  end
end

drink = Drink.new("モカ")
drink.whipped_cream
puts drink.name #=> モカホイップクリーム
  • includeメソッド
    • モジュールに定義したインスタンスメソッドを利用できる(モジュールのインクルード)

9.2 モジュールのメソッドをクラスメソッドにする

## モジュールのメソッドをextendを使ってクラスメソッドとして利用する
module Greeting
  def welcome # extendしたいメソッドをインスタンスメソッドとして定義
    "いらっしゃいませ!"
  end
end
class Cafe
  extend Greeting
end
puts Cafe.welcome #=> "いらっしゃいませ"
  • extendメソッド
    • モジュールに定義したメソッドをextend先のクラスのクラスメソッドとして使える

9.3 モジュールにクラスメソッドを定義する

## 定義の仕方も呼び出し方もクラスと同様
module WhippedCream
  def self.info
    "トッピング用ホイップクリーム"
  end
end
puts WhippedCream.info #=> トッピング用ホイップクリーム
## モジュールに定義された定数の使い方
module WhippedCream
  Price = 100
end
puts WhippedCream::Price #=> 100

9.4 名前空間

## モジュールを使って名前を付け分ける
module BecoCafe
  class Coffee
    def self.info
      "深みと香りのコーヒー"
    end
  end
end
module MachuCafe
  class Coffee
    def self.info
      "豊かな甘みのコーヒー"
    end
  end
end
puts BecoCafe::Coffee.info #=> 深みと香りのコーヒー
puts MachuCafe::Coffee.info  #=> 豊かな甘みのコーヒー

9.5 別ファイルのクラスやモジュールを読み込む

## 1.モジュールを別ファイルに定義する
module WhippedCream
  def whipped_cream
    @name += "ホイップクリーム"
  end
end
## 2.別ファイルのモジュールを読み込む
require_relative "whipped_cream"
class Drink
  include WhippedCream
  def name
    @name
  end
  def initialize
    @name = "モカ"
  end
end

mocha = Drink.new
mocha.whipped_cream
puts mocha.name #=> モカホイップクリーム
  • require_relativeメソッド
    • ファイルに定義されたクラスやモジュールを読み込んで使えるようにする
    • 別のファイルを読み込むときはrequire_relativeメソッドを使うのがおすすめ(requireではなく)
    • 書き方:require_relative "ファイル名"

10章 ライブラリ

10.1 ライブラリの種類

10.2 Bundler

Bundlerとは、複数のGemを管理するツール

  • BundlerでGemをインストールする手順
    • 1.Bundlerのインストール
      • gem install bundler(※Bundler自身もGemの一つ)
    • 2.Gemfileの作成(bundle init)
      • bundle init(Gemfileの雛形を作成)
      • GemfileにGem名を追記(gem "rails"など)
    • 3.bundle installコマンドの実行
      • bundle install(Gemのインストールと同時にGemfile.lockが作成される)
  • bundle update(Gemのバージョンアップ)
    • bundle updateコマンドを使うことで新しいバージョンのGemをインストールできる
    • bundle updateコマンド実行時にGemfile.lockが更新され新たにインストールしたバージョンが書き込まれる
    • 使い方:bundle update
  • bundle exec(使用するGemのバージョンを指定)
    • Gemfile.lockに書かれたバージョンのGemを使ってプログラムを実行する(アプリケーション配下のディレクトリに存在するGemパッケージを使うように指示する)
    • 使い方:bundle exec ruby example.rb

11章 使いこなす

11.1 例外処理

## 例外処理の定義
begin
  #例外が発生する可能性がある処理
rescue 例外クラス => e
  #例外が発生した時に実行する処理(rescue節)
end
  • rescue節は例外が発生した時のみ実行される
  • rescue 例外クラスのように処理対象となる例外クラスを書く
  • 変数eに例外オブジェクトが代入される

11.1.1 例外クラス

11.1.2 rescue節での例外クラスの省略

  • rescue => erescue StandardError => eは同じ
    • rescue節で例外クラスを省略した場合、StandardErrorとそのサブクラスを補足する
    • rescue Exception => eと書く機会はほとんどない
      • 意図しない例外や構文エラーまで受け取ってしまうため

11.1.3 例外を発生させる - raiseメソッド

  • raiseメソッド
    • raise <例外クラス>, "例外メッセージ"
    • raise "例外メッセージ"
      • 例外クラスを指定しないとRuntimeError例外が発生する

11.1.4 例外の有無に関わらず処理を実行する - ensure

begin
  #例外が発生する可能性がある処理
rescue 例外クラス => e
  #例外が発生した時に実行する処理
ensure
  #例外の発生有無に関わらず実行される処理(ensure節)
end

11.2 クラスの高度な話

11.2.1 インスタンス変数を簡単に操作する

11.2.2 self

  • selfはその場所でメソッドを呼び出すときのレシーバのオブジェクトを返す
  • インスタンスメソッドでのselfは、そのクラスのインスタンスになる
  • クラスメソッドでのselfは、そのクラスになる

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

  • クラスインスタンス変数
    • クラスメソッド内のインスタンス変数
## クラスインスタンス変数の例
class Drink
  def name # インスタンスメソッドnameを定義
    @name = "カフェラテ" # (インスタンスメソッドの)インスタンス変数@nameへ代入
  end
  def self.name # クラスメソッドnameを定義
    @name  # (クラスメソッドの)インスタンス変数@nameを返す
  end
end
drink = Drink.new
drink.name # インスタンスメソッドnameを呼び出し
p Drink.name #=> nil # クラスメソッドnameを呼び出すとnil

11.2.4 クラス変数

  • クラス変数
    • クラスで共有される変数
    • クラス変数は継承したクラスでも共有する点がクラスインスタンス変数と異なる
    • 例:@@name

11.3 ブロックの高度な話

11.3.1 ブロックを渡すメソッド呼び出し

## ブロックを渡すメソッド呼び出し
def foo
  p block_given?
end

foo #=> false

foo do
end #=> true

11.3.2 yieldを使って渡したブロックを実行する

## yieldを使って渡したブロックを実行する
def dice
  if block_given? # ブロックが渡されたか?
    # ブロックを渡されたときの処理
    puts "run block"
    yield # 渡されたブロックを実行
  else
    # ブロックを渡されなかったときの処理
    puts "normal dice"
    puts [1,2,3,4,5,6].sample
  end
end

# ブロックを渡さないとき
dice # 1から6までの中の1つをランダムで表示

# ブロックを渡すとき
dice do
  puts [4,5,6].sample # 4から6までの中の1つをランダムで表示
end
  • yieldを使うと、メソッドの中で実行する処理を、メソッド呼び出し元にブロックで書くことができる

11.3.3 ブロックを引数で受け取って実行する

## ブロックを引数で受け取って実行する
def foo(&b) # 引数bは先頭に&がついているので、ブロックを受け取って代入される
  b.call # 渡されたブロックを実行
end

# fooメソッドをブロックを渡して呼び出し
foo do
  puts "Chunky bacon!!" #=> Chunky bacon!!
end
  • ブロックを受け取る引数は先頭に&を書く(上記の&b)
  • 変数に代入されたブロックはcallメソッドで実行する
  • Procオブジェクト
    • ブロックの処理をオブジェクト化したもの(ブロックをProcというオブジェクトとして扱っている)
    • 渡されたブロックはProcクラスのオブジェクト