目次
Ruby
自然で直感的な記述、分かりやすい構文、オブジェクト指向、関数型言語的なアプローチ、強力なリフレクション等など、言語大好き人間には非常に魅力的なスクリプト言語
Ruby実行環境
メモ
Webフレームワーク
ライブラリ
インストール
パッケージ管理で
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
という呼び出しはできない。