====== 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
という呼び出しはできない。