====== Ruby ====== 自然で直感的な記述、分かりやすい構文、オブジェクト指向、関数型言語的なアプローチ、強力なリフレクション等など、言語大好き人間には非常に魅力的なスクリプト言語 ===== Ruby実行環境 ===== * Ruby C言語で書かれた公式のRubyインタプリタ * Rubinus C言語で書かれた別のインタプリタ * [[JRuby]] Java言語で書かれたRubyインタプリタ、JVM上で動作する * [[http://code.google.com/p/xruby/|XRuby]] 実行環境というかコンパイラ。Javaバイトコードに変換する。 * IronRuby .NET上の実行環境。 ===== メモ ===== * [[rubygems]] * [[ruby:flock]] ===== Webフレームワーク ===== * [[rails|Ruby On Rails]] * [[Waves]] ===== ライブラリ ===== * [[ruby:hpricot]] - 軽量HTMLパーザ ===== インストール ===== パッケージ管理で debian、ubuntu # aptitude install ruby MacOSX # port install ruby 自分で make する # ./configure --prefix=/usr/local --program-suffix=1.9 # make # make install /usr/local/bin/ruby1.9 にインストールされる ===== クラス変数の定義 ===== @@を使う。変数が初期化されていないとエラーになるので嫌な感じ class Hoge def self.hoge= v @@hoge = v end def self.hoge @@hoge end end Hoge.hoge = "ほげ" p Hoge.hoge クラスの特異メソッドとしてアクセサを作成する、初期化されていなくてもエラーにならない。@@hogeという変数とは無関係。 class Hoge class << self attr_accessor(:hoge) end end Hoge.hoge = "ほげ" p Hoge.hoge ===== ブロック付きメソッド ===== class Hoge def initialize @hoge = "ほげ" @a = [1,2,3] end # ブロックを引数にとる場合は引数に&を付けて、最後の引数に def hoge(a, b, c, &block) yield a, b end # ブロック引数は省略できる def hoge(a, b, c) yield a, b end # ブロックが渡されてるときのみブロックを実行 def hoge2(h, &block) @hoge = h yield @hoge if not block.nil? end # または def hoge2(h) @hoge = h yield @hoge if bloc_given? end # ブロックをインスタンスフィールドのメソッドに渡し、ブロック処理を委譲 def hoge3(&block) @a.each &block end end ===== 基本的なこと ===== ==== コンストラクタ ==== initializeはコンストラクタが呼び出すprivateメソッド。親クラスのinitializeは子クラスをnewしたときに呼ばれない。 ==== privateメソッド ==== レシーバの省略記述しかできないメソッドが private。レシーバを省略した場合は自分自身がレシーバであると解釈されるので、自分のクラス内部からしかアクセスできないという事になる。 子クラスは親クラスのメソッドへアクセスするときにレシーバを省略できるので、子クラスから親クラスの private メソッドを呼び出せる ==== インスタンス変数 ==== インスタンス変数は private 変数だが、親クラスの private 変数にもアクセスできる。 ==== 関数 ==== (ここの理解は怪しい) Rubyにおける関数は Object の private メソッドである(実際は Kernel モジュールに定義されている) トップレベルに関数を定義すると、Objectの private メソッドとして定義される。すべてのクラスは Object のサブクラスなのでどのクラスの内部からでもprivateメソッドとして呼び出せる。 def hoge puts "aaa" end class Fuga def test hoge end end fuga = Fuga.new fuga.private_methods.include?("hoge") # => true fuga.test # => "aaa" と表示 Objectクラス自身もObjectを継承したClassクラスのインスタンスなので、関数はクラスメソッドとしても定義される。 def hoge puts "aaa" end class Fuga end Fuga.private_methods.include?("hoge") # => true class Piyo hoge # => "aaa" と表示 end トップレベルはmainという名前のObjectクラスのインスタンスの中であるので、トップレベルで呼び出せる def hoge puts "aaa" end hoge # => "aaa" と表示 ということは… @a = "あ" def hoge puts @a end hoge # => "あ" と表示される ただし private メソッドとして定義されるので def hoge end self.hoge # Error という呼び出しはできない。