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]$