Skip to content

Instantly share code, notes, and snippets.

@Epictetus
Forked from naoto/Hello_Ruby_World.mkdn
Created November 6, 2010 12:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Epictetus/665381 to your computer and use it in GitHub Desktop.
Save Epictetus/665381 to your computer and use it in GitHub Desktop.

この文章はJavaまたはPHP経験者に向けたRuby入門のすすめである

Ruby version: 1.8.7

1.クラス定義とメソッド定義

クラスの定義の仕方はJava及びPHPと大差はない。 しかしメソッド定義に関しては若干の違いがある。

class Hoge
  def initialize()
  end
end

上記のコードを一行づつ見ていこう

class Hoge

これはクラス定義だ。 Hogeという名前のクラスを作ってる。

def initialize()

これはメソッド定義。 def というのはメソッドであるという宣言だ。 initialize というのはメソッド名だが、この名前はコンストラクタとして予約されている。 すなわち new した時 (インスタンス生成時) に呼ばれるメソッドを定義してるのだ。

もちろんコンストラクタが不要の場合は定義しなくてもよい。

2.戻り値

Ruby は基本的に全てのメソッドは何かしらの値を必ず返す事になっている。

しかし必ず return を書けというわけではない。

どういう事かコードを見てみよう

class Hoge

  def fuga()
    return 1 + 1
  end

  def hago()
    1 + 1
  end

end

さてこのコードの fuga メソッドを呼び出したとする。

当然 1 + 1 の結果である 2 が戻り値として返される。

それでは hago メソッドを呼び出した時はどうだろう。

これも 1 + 1 の結果値である 2 が戻り値として返される。

Ruby は return が明示されてない場合、最後に評価した結果を返すのである。

評価とは実行された結果の事なので必ず式の結果であるとは限らない。

3.クラスのインスタンス化

クラスをインスタンス化する方法はJavaやPHPとは少し異なっている。

たとえば

Javaでは
Hoge hoge = new Hoge();

PHP
$hoge = new Hoge();

このように new クラス名(引数) となるが Ruby だとこうなる

hoge = Hoge.new()

new 自体がクラスメソッド (static メソッド) なのだ。

newというメソッドの戻り値がそのクラスのインスタンスとなる。

ここでPHPな人には注意だが、メソッドの呼出は -> ではなく . をつかう。

決して文字列を連結しているわけではない。

4.変数の種類

Ruby の変数は大きく分けて 3 つある

  1. ローカル変数
  2. インスタンス変数
  3. クラス変数
  4. グローバル変数

それぞれを一つづつ見ていこう。

ローカル変数

ローカル変数とはメソッド内や特定のブロック内で共通の変数である。

JavaやPHPをやっている人に得に説明する必要はないだろう。

class Hoge

  def fuga()
    hoge = "Fuck"
  end

end

hago がローカル変数である。

この場合は def のブロック内すなわち def と対になる end まで有効となる変数である。

インスタンス変数

インスタンス変数とはインスタンス内で共通のスコープをもつ変数の事である

JavaやPHPで言うところの this.hoge や $this -> hoge の事である。

まずはコードを見て見よう

class Hoge

  def set(fuga)
    @hago = fuga
  end
  
  def get()
    @hago
  end

end

@hago がインスタンス変数である。

@がインスタンス変数である事の宣言であり hago が変数名である。

このクラス内において set で呼ばれている hago と get で呼ばれている hago は同じポインタを参照している事になる。

クラス変数

クラス変数とはそのクラス内で共通のスコープを持つ変数である。

Java でいうところの static 変数である。

class Hoge

  def fuga(hago)
    @@hago = hago
  end

end

まずは上記のサンプルコードを見てみよう。

@@hago というのがクラス変数である。

@@ がクラス変数である事の宣言であり hago は変数名なのだ。

それでは @@ がついていない引数の hago はなにか。

これはローカル変数である。

ローカル変数については後述する。

クラス変数はクラスで共通なので

class Hago

  def set()
    @@hago = "hoge"
  end

  def get()
    @@hago
  end
end

hago1 = Hago.new
hago2 = Hago.new
hago1.set("fuga")
hago2.get()   #=> fuga

このように同じクラスのインスタンスであれば同じポインタの変数を扱っている事になる

グローバル変数

実行するスクリプトおよびアプリケーション間で共通となる変数である。

PHPでいう所の $GLOBALS の事である。

コードを見てみよう

class Hoge

  def fuga()
    $hago
  end

end

class Fuck

  def set(fuga)
    $hago = fuga
  end

  def get()
    Hoge.new.fuga()
  end

end

fuck = Fuck.new
fuck.set("Fack Method")
fuck.get()    #=> Fack Method

ちょっと長くなってしまったが $hago がグローバルメソッドである。

$ がグローバルメソッドの宣言であり hago が変数名となる。

クラスやメソッドの垣根を越えて共通のポインタを参照しているため set で入力した値が Hoge クラスのインスタンスから取得できるのだ。

これでひとまずの基本的なクラスとメソッドの説明は終りである。 次はイテレーションや演算子など実際の処理でよく使うところを見ていこう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment