Skip to content

Instantly share code, notes, and snippets.

@kidach1
Created November 18, 2013 01:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kidach1/7521086 to your computer and use it in GitHub Desktop.
Save kidach1/7521086 to your computer and use it in GitHub Desktop.
[Ruby] ブロックとProcをちゃんと理解する ref: http://qiita.com/kidachi_/items/15cfee9ec66804c3afd2
#ブロックを受け取るメソッドの定義
def give_me_block
yield
end
#メソッドの引数としてブロック(do~end)を渡して、実行
give_me_block do
p "Hello, block!"
end
=> "Hello, block!" #give_me_block内で、yieldによって呼び出された。
#メソッド定義
def give_me_block( &block )
block.call
end
#実行
give_me_block do
p "Hello, block!"
end
=> "Hello, block!"
n = 1
proc = Proc.new do
n = n + 1
end
proc.call
=>2
proc.call
=>3
proc.call
=>4
def wonder_seven_box
if block_given?
yield(7)
else
p "Don't mind. Feel free to call me." # ブロックが与えられなければこちら
end
end
wonder_seven_box do |x|
p 3 + x
end
=> 10
wonder_seven_box do |x|
p "happy_block! " * x
end
=> "happy_block! happy_block! happy_block! happy_block! happy_block! happy_block! happy_block! "
wonder_seven_box
=> "Don't mind. Feel free to call me."
def magic_five_box(after_input, someProc)
someProc.call(5, after_input)
end
def wonder_seven_box
if block_given?
yield(7)
else
p "Don't mind. Feel free to call me." # ブロックが与えられなければこちら
end
end
def give_me_block( &block )
block.call
end
def test_method ( args )
if args_given?
hoge
else
fuga
end
end
#メソッド定義
def give_me_block( &block )
yield # block.callをやめてyieldに変更
end
#実行
give_me_block do
p "Hello, block!"
end
=> "Hello, block!"
#メソッド定義
def give_me_block # (&block)を除去
yield
end
#実行
give_me_block do
p "Hello, block!"
end
=> "Hello, block!"
#インスタンス生成
proc1 = Proc.new do
p "hoge"
end
#実行
proc1.call
=> "hoge"
#インスタンス生成
proc2 = Proc.new do |s| #sが仮引数
p "Hello, #{s}!"
end
#実行
proc2.call("Proc") #"Proc"が実引数
=> "Hello, Proc!"
#インスタンス生成
lambda1 = lambda { p "hoge" }
#実行
lambda1.call
=> "hoge"
lambda2 = lambda { |s| p "Hello, #{s}!" }
lambda2.call("Proc")
=> "Hello, Proc!"
def magic_five_box(after_input, someProc)
someProc.call(5, after_input)
end
sum_proc = Proc.new do |x, y|
p x + y
end
magic_five_box(3, sum_proc)
=> 8
string_proc = Proc.new do |x, string|
p string * x
end
magic_five_box('happy_proc! ', string_proc)
=> "happy_proc! happy_proc! happy_proc! happy_proc! happy_proc! "
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment