2013年2月11日月曜日

7つの言語7つの世界 [Ruby 2日目]

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 件のコメント:

コメントを投稿