Ruby2日目
今回はCollectionやコードブロックの説明。この辺が出てくるとRubyっぽいかも。
Rubyは多重継承を避けるためにMixinを使ってる。
Mixinと言う単語は始めて聞いたが、多重継承を避けるための工夫としておもしろい。
各オブジェクト指向言語での多重継承の仕様に関して時間があったらここでまとめてみよう。
試してみよう
最初にeachだけを用いて16個の数値と4個の数値の配列の中身を同時に出力せよ。次に、同じ異をEnumerableのeach_sliceを用いて実行せよ
each
#!/usr/bin/ruby a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] b = [20,21,22,23] i=0 a.each {|x| puts x puts b[i%4] i+=1 }
each_slice
#!/usr/bin/ruby a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] b = [20,21,22,23] a.each_slice(4) {|ar| ar.each_with_index{|x,i| puts x puts b[i] } }
あってるのかな?いまいち出題の意図がつかみきれてない気がする。
Treeクラスを改造してinitializerにハッシュと配列が入れ子になった構造を指定できるようにせよ。
#!/usr/bin/ruby class Tree attr_accessor :children, :node_name def initialize(child_list, key=nil) @children = [] if key == nil child_list.each{|root_key,root_value| @node_name = root_key child_list = root_value } else @node_name = key end child_list.each{|other_key,other_value| @children.push(Tree.new(other_value,other_key)) } end def visit_all(&block) visit &block children.each{|c| c.visit_all &block} end def visit(&block) block.call self end end init_list={'grandpa' => {'dad' => {'child 1' => [], 'chil\ d 2' => []}, 'uncle' => {'child 3' => [], 'child 4' => []\ }}} ruby_tree = Tree.new(init_list) puts "Visiting a node" ruby_tree.visit {|node| puts node.node_name} puts "visiting entire tree" ruby_tree.visit_all {|node| puts node.node_name}
root nodeの扱いに苦労した。
Grepをかけ
#!/usr/bin/ruby r = Regexp.new(ARGV[0]) ARGV.shift ARGV.each do |filename| i=0 File.open(filename, "r") do |io| while l=io.gets if l=~r puts filename+" @ "+i.to_s()+" : "+l end i+=1 end end end
0 件のコメント:
コメントを投稿