2012年4月19日木曜日

Rubyをはじめました(2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
与えられた配列の奇数番目の要素の合計を求めるメソッドf(xs)の実装
f([0, 1, 2, 3, 4]) = 1 + 3 = 4
f(['a', 'b', 'c', 'd', 'e']) = 'b' + 'd' = 'bd'
Enumeratorを読みながら irbで試行錯誤しながらたどり着いた答え。
[0, 1, 2, 3, 4].each_with_index.select{|v, k| k.odd?}.map{|v,k| v}.inject{|x, y| x+y}
これの「Ruby の Enumerable モジュールにはたくさんのメソッドが定義されている」も参考になる。
リストが空のとき困るpythonはポテト言語。reduceとかmapとかは飾りです。書ける人にそれがわからんのです。
他の解法
xs.drop(1).each_slice(2).map(&:first).inject :+

twitterで同じような問題をやっている人がいた。
問題:乱数で生成した0~9の文字をカウントせよ。
100.times.map{rand(10)}.group_by { |i| i%10}.map {|k, v| [k, v.length]}.sort 
100.times.map{rand(10)}.inject(Hash.new(0)) {|h, r| h[r] += 1; h }

2012年4月17日火曜日

Rubyはじめました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
termtterのpluginを作った。 成果物

気づいたこと(=ハマったこと)・気になったこと・教えていただいたことなど

  • 変数関係:大文字始まり、$, @, @@. これらは名前の一部。@が修飾でついているわけではない。
  • pythonと違い"と'では意味が違う
  • ","でlist/tupleを作ることができる。いらん","がついていると...これはpythonも同じ。
  • コード探査のために知っておくべきmethod:
    • object.methods,
    • object_id,
    • global_variables
    • instance_variables
    • local_variables
  • self以外に引数がないmethodは()なしで呼び出される
  • !とか?をmethod名に含めることができる
  • moduleはmoduleを使って明示的に作る。load/requireはfileを読み込むだけ.module名とfile名に関係がないこともありうる。 c.f. pythonはfileとmoduleが一致している。
  • local_scopeはblock内に閉じる。同名moduleがあっても(再び開いた)としても違うscope扱い
  • ローカル変数のスコープはパース時に静的に確定する。(ブロックの最後まで見て先に変数の集まりが作られている)
  • block: 用はクロージャを渡している。参照
upcomings:
  • eval3使徒
    • eval
    • module_eval
    • instance_eval
またそのうちハマったらpostするかも。 はまった・・・ これの「定数と関数のための名前空間としてのモジュール」を参照。 一言でいうならmodule_functionの話。
module Foo
  K = 1
  def baz
  end
  module_function :baz  
end
なんだこれ、キモい。この言語、こわれてんじゃない?