0Pricing
Ruby Academy · レッスン

ブロックの復習

メソッドにブロックを渡します。

「ブロックの復習」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

メソッドにブロックを渡す

ブロックとは、メソッドに渡すコードのまとまりです。eachなど多くのRubyメソッドはブロックを受け取り、そのブロックを実行します。ブロックは、Rubyの表現力豊かなスタイルの基礎です。

[1, 2, 3].each do |n|
  puts n * 10
end

ブロックの2つの構文

複数行のブロックにはdo ... endを使い、短い1行の処理には波括弧{ }を使います。どちらも同じように動作します。

[1, 2, 3].each { |n| puts n }

ブロックパラメーター

パイプ| |の間にある名前が、ブロックのパラメーターです。何を渡すかはメソッドが決めます。

{ a: 1, b: 2 }.each do |key, value|
  puts "#{key} = #{value}"
end

yieldでブロックを呼び出す

メソッド内でyieldを使うと、渡されたブロックを実行できます。yieldを使うために、パラメーターリストでブロックを宣言する必要はありません。

def twice
  yield
  yield
end
twice { puts "Hi" }

引数を付けたyield

yieldを通じてブロックに値を渡せます。値はブロックのパラメーターに入ります。

def greet_each(names)
  names.each { |n| yield n }
end
greet_each(["Ann", "Bo"]) { |name| puts "Hello #{name}" }

block_given?

ブロックなしでyieldを呼び出すとエラーが発生します。block_given?で先に確認すると、ブロックを任意にできます。

def maybe
  if block_given?
    yield
  else
    puts "No block provided"
  end
end
maybe
maybe { puts "Block ran" }

ブロックの戻り値

ブロックは最後の式の値を返します。mapなどのメソッドは、その戻り値を集めて新しい配列を作ります。

squares = [1, 2, 3, 4].map { |n| n * n }
p squares

yieldの値

yield自体もブロックの値を返すため、メソッドは呼び出し側から渡されたブロックを通じて入力を変換できます。

def transform(x)
  yield x
end
result = transform(5) { |n| n + 100 }
puts result

&でブロックを捕捉する

最後のパラメーターの前に&を付けると、ブロックを保存したり渡したりできるProcオブジェクトとして捕捉できます。

def run(&block)
  block.call
end
run { puts "Called via block.call" }

番号付きパラメータ

現代のRubyでは、_1(またはRuby 3.4以降のit)を使うと、1つのブロックパラメータに名前を付けずに済みます。短いブロックに便利です。

[10, 20, 30].each { puts _1 }

まとめ

ブロックを使うと、メソッドに振る舞いを受け渡せます。

  • do...endまたは{ }でブロックを渡します。
  • yieldでブロックを実行し、block_given?で渡されているかどうかを確認します。
  • &blockで再利用可能なオブジェクトに変換します。
def repeat(times)
  return unless block_given?
  times.times { |i| yield i }
end
repeat(3) { |i| puts "Step #{i}" }

理解度チェック

ブロックについての理解度を確認しましょう。

振り返り

ブロックについて学んだことを振り返りましょう。

  • do...endまたは{ }を使うと、ブロックによってメソッドに振る舞いを渡せます。
  • yieldはブロックを実行し、その値を返します。
  • block_given?を使うと、ブロックを省略可能にできます。
  • &blockはブロックをProcとして捕捉します。
def wrap
  puts "<<"
  yield
  puts ">>"
end
wrap { puts "content" }

よくある質問

「ブロックの復習」レッスンは無料ですか?

はい。「ブロックの復習」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「ブロックの復習」で何を学びますか?

メソッドにブロックを渡します。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ブロックの復習」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ブロックの復習
  2. Proc
  3. ラムダ
  4. クロージャとスコープ
← Ruby Academyに戻る