ユーザ用ツール

サイト用ツール


ruby

Ruby

自然で直感的な記述、分かりやすい構文、オブジェクト指向、関数型言語的なアプローチ、強力なリフレクション等など、言語大好き人間には非常に魅力的なスクリプト言語

Ruby実行環境

  • Ruby C言語で書かれた公式のRubyインタプリタ
  • Rubinus C言語で書かれた別のインタプリタ
  • JRuby Java言語で書かれたRubyインタプリタ、JVM上で動作する
  • XRuby 実行環境というかコンパイラ。Javaバイトコードに変換する。
  • IronRuby .NET上の実行環境。

メモ

Webフレームワーク

ライブラリ

  • hpricot - 軽量HTMLパーザ
  • redcloth - Textileから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

という呼び出しはできない。

ruby.txt · 最終更新: 2015/07/29 11:07 by nullpon