5
5

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 5 years have passed since last update.

Rubyにおける`{}`とメソッドの相互作用

Posted at

Rubyの世界ではだいたいなんでもオブジェクトだったのでした。

Rubyのメソッドは()で括った引数だけでなく、
do .... end または{ .... }で括ったコードブロックを続けることができます。

コードブロックは引数同様メソッドに引き渡されます。
したがって、メソッドはブロックに対して、それを実行したり、それを変数に保存しておいたりと様々な処理を施せます。
こういうのを「ブロック付きメソッド呼び出し」とか「ブロック構文」とか呼びます。
では、メソッドとコードブロックはどのようにはたらくのでしょうか。

メソッド内にyieldを書くことがポイントです。
大雑把には、yield = (コードブロックの中身に書いてあること) としてはたらきます。

# yieldを手続きとしてみなす
def foo
    print "yo!"
    yield
    print "yoyoyo!"
end

foo{ print "yoyo!" }

こうなる

# yieldを値(返り値)としてみなす
def foo
   return yield
end

print foo{ "Hello." }

こうなる

# yield var1, var2, ... と書くと、逆流(?)する。すなわち、メソッド内からブロックの||で囲われた部分へブロックパラメータが渡る。
def foo
   yield 1, 2, 3
end

foo{|x, y, z|
    print x
    print y
    print z
}

こうなる

ブロック構文がわかると

['toast', 'cheese', 'wine'].each { |food| print food.capitalize }

たのしい引用元
みたいな、Ruby独特の書き方が身近に感じられるような気がしますね・・・?

5
5
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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?