Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[tama.rb#13]Hash#to_procについて

 [tama.rb#13]Hash#to_procについて

Tama.rb #13 チェリー本輪読会にてLTしたスライドになります。
https://tamarb.connpass.com/event/123799/

ken3ypa

March 30, 2019
Tweet

More Decks by ken3ypa

Other Decks in Programming

Transcript

  1. Hashオブジェクトを&付きで渡してみる h = {1 => 10, 2 => 20, 3

    => 30} def fuga(h) hash end def hoge(&hash) hash end p fuga(h) #=>{1=>10, 2=>20, 3=>30} p hoge(&h) #=>#<Proc:0x0000556990170f08> # やってることは p h.to_proc 変数に格納したHashを&付きで渡してあげると Procオブジェクトが返ってきている 9
  2. 最初のサンプルコードを確認すると h = {1 => 10, 2 => 20, 3

    => 30} [1, 2, 3].map(&h) # => [10, 20, 30] L1: ハッシュを変数に格納する L2: [1, 2, 3]という配列を用意しmap(&h) hにto_procが呼び出され、Procオブジェクトに変換される Procオブジェクトがmapに渡される 配列の各要素([1, 2, 3])が実行時のhの第一引数として渡される 第一引数に渡された各要素がハッシュのキーに一致したらハッシュの値を返す mapメソッドはProcの戻り値を新しい配列に詰め込む [10, 20, 30] Yay!!!! 10
  3. 何が嬉しいの? キーの配列から値をマッピングする際に簡潔にかけるようになる。 h = {1 => 10, 2 => 20,

    3 => 30} p [1, 2, 3].map { |int| h[int] } #[ 10, 20, 30] p [1, 2, 3].map(&h) # [10, 20, 30] 比較するとあら綺麗 11
  4. Before class Scrabble SCORE = {1 => %w(A E I

    O U L N R S T), 2 => %w(D G), 3 => %w(B C M P), 4 => %w(F H V W Y), 5 => %w(K), 8 => %w(J X), 10 => %w(Q Z)} def initialize(chars) letters = chars.to_s.upcase.scan(/\w/) @sum = alfabets.inject(0) {|sum, char| sum + aggregate(char)} end def score @sum end def self.score(chars) self.new(chars).score end private def aggregate(char) SCORE.find {|k, v| v.include?(char)}.first end end 15
  5. After class Scrabble SCORE = %w{AEILNORSTU DG BCMP FHVWY K

    JX QZ} .zip([1, 2, 3, 4, 5, 8, 10]) .flat_map {|letters, score| letters.chars.product([score])} .to_h def initialize(chars) letters = chars.to_s.upcase.scan(/\w/) # ["T", "A", "M", "A", "R", "B"] @sum = letters.sum(&SCORE) end def score @sum end def self.score(chars) self.new(chars).score end end p Scrabble.new("tamarb") 16
  6. 18