モジュール

モジュールを少し勉強した。

module Trig
  PI = 3.141592654
  def Trig.sin(x)
    # ..
  end
end

requre 'trig'

y = Trig.sin(Trig::PI/4)

reqireで文字列で渡すのはまあ良いとして、定数アクセスの"::"と、メソッドアクセスの"."を区別しているのは気に入らない。reqireした際に変数は取り込まれないのも覚えるのが大変そう。メソッド定義で"Trig."を付けるのが面倒など色々不満が出た。もう少し使い込んでみないとそうすべき理由が見えない。


minxinの説明で、include Enumerableして、eachメソッドを定義すれば、map、include?、find_all?、injectなどが普通に使えるようになるのは良さそうに感じた。


あと、Rubyはビルトインクラスの挙動をプログラム全体で変更できるが、Pythonは基本的にビルトインの挙動は継承する以外は変更不能なので安全だが、Rubyは思い切ったことができる。あと以下の例を見てコードを短く書けるというのを感じた。

class VowelFinder
  include Enumerable

  def initialize(string)
    @string = string
  end
  def each
    @string.scan(/[aeiou]/) do |vowel|
      yield vowel
    end
  end
end
vf = VowelFinder.new("the quick brown fox jumped")
vf.inject {|v,n| v+n }  #=> "euiooue"

やはりjijixiさんの言うとおり、ちょっとしたコードを書くならRuby便利かな。Pythonでもライブラリ作りこんでおけば同等以上なパワーは得られると思うが、結局標準ライブラリの力は大きいかも。もちろんこの例の程度ならPythonでも十分ではある。とりあえずコレクションクラスの使い方を押さえたいなあ。


しかし、endが不要な分Pythonの方が縦に短くなる可能性があるが、Rubyは式と文があまり区別なさそうなので、ショートコードでそこは大きいのかも。というか、Rubyではある意味すべて式?