yield sample

# rubyのすべてのメソッドは、ブロックを引数にすることができる。
# (メソッドにはブロックを渡すことができる)
# ディフォルト引数 ?と似ている?

# 渡したブロックは、メソッド内で手続き型のオブジェクトとして扱われる
# 手続き型オブジェクト = Procクラスのインスタンス

# proc .. ブロックを手続き型のオブジェクトにしたもの。
# &proc .. ブロックを表す


# Proc はブロックを
# コンテキスト(ローカル変数のスコープやスタックフレーム)とともにオブジェクト化 した手続

オブジェクト指向スクリプト言語 Rubyのp97あたり,よりコード借用。

[hirasawa@localhost ruby]$ cat myYield1.rb 
#!/usr/local/bin/ruby -Ku
def search(ary)
 for item in ary
  return item if yield(item)
 end
end

result = search(["abc","bcd","cef"]){|str| str[0] == "b"  }
p result
[hirasawa@localhost ruby]$ cat myYield2.rb 
#!/usr/local/bin/ruby -Ku
def esbk(hash)
 hash.keys.sort.each do |x|
  yield(x*x , hash[x])
 end
end

hash = {1=>2,2=>4}
esbk(hash) { |key,val|
 print "hash[",key,"] = ",val , "\n"
}
[hirasawa@localhost ruby]$ 

以下は???だらけだけど、
動きはなんとなくわかったぞ、と

[hirasawa@localhost ruby]$ cat myYield3.rb 
#!/usr/local/bin/ruby -Ku
def flat(array)
 for item in array
#  print("top*",item,"*")
  if item.kind_of?(Array)
   flat(item) {|x| yield(x)}
#   flat(item) {|x| print("1st*",x,"*")}
  else
   yield(item)
#   print("2nd*",item,"*")
  end
 end
end

flat([0, [1 , [2 , 3]] , [ 4 , 5 ]] ) {|x| print x }
print "\n"
[hirasawa@localhost ruby]$ ./myYield3.rb 
012345

コメントアウトを外すしてうごかしてみる。
"1st"の部分が出てこないんですけど........
うう、意図がよくわからない orz

でも item.kind_of(Array)の挙動はわかったんで、
吉としよう

[hirasawa@localhost ruby]$ vi myYield3.rb 
[hirasawa@localhost ruby]$ ./myYield3.rb 
top*0*2nd*0*top*[1, [2, 3]]*top*1*2nd*1*top*[2, 3]*top*2*2nd*2*top*3*2nd*3*top*[4, 5]*top*4*2nd*4*top*5*2nd*5*
[hirasawa@localhost ruby]$