K.Sasada's Home Page

Diary - 2012 January

研究日記

睦月

_26(Thu)

■他の言語になれた人がRubyに躓く n のポイント

Ruby はちょっと特殊なプログラミング言語なので,他の言語になれた人は,ちょっと戸惑うかもしれません.そんな躓きそうなポイントを紹介していきます.

□オブジェクト指向

Ruby はプロトタイプ型オブジェクト指向です.オブジェクトにメソッドを定義し,それを dup によって複製しながらオブジェクトを作っていきます.

a = Object.new
def a.foo
  p "foo"
end
b = a.dup

□複数のメソッド定義

複数のメソッドを定義する場合,ruby では,def ではなく,method_missing という機能を使うのが一般的です.

def a.method_missing mid, *args
  case mid
  when :bar
    p "bar"
  when :baz
   p "baz"
  end
end

簡単に,bar と baz というメソッドを定義することができました.

□メソッド呼び出し

send という構文を使います.さっきの例だと,foo メソッドは次のように呼び出します.

a.send("foo")

□数値計算

Ruby では,数値計算を行う場合,.+(),.-() みたいな書き方をします.

# 例えば,1+2*3 を計算する場合
result = 1.+(2.*(3))

このように書くことで,優先順位に迷うことが無くなります.

□繰り返し

Ruby では,i 回繰り返しをするためには,メソッドの動的再定義と,再帰を使います.

def kurikaeshi i
  if i.<(0)
    def kurikaeshi i
    end
  else
    # ここに繰り返したい処理を書く
  end
  kurikaeshi i.-(1)
end
kurikaeshi 10 # 10 回の繰り返し

動的に定義を変更できる Ruby ならではですね.


飽きた.全部 lambda で書くんだった.


■他の言語になれた人がRubyに躓く n のポイント

Ruby はちょっと特殊な関数型プログラミング言語なので,他の言語になれた人は,ちょっと戸惑うかもしれません.そんな躓きそうなポイントを紹介していきます.

□関数定義

関数は次のように定義します.また,次のように呼び出します.

(#defun
 foo = (lambda{|x| (p (x))})
)
(foo.call("foo")) #=> foo を表示

もちろん,関数は高階ですので取り回すことも可能です.

ちなみに,Ruby 1.9 では lamda と綴れない人のために,-> という記号が利用できることになりました.

(#defun
  foo = (->(x) {(p (x))})
)
(foo.call("foo")) #=> foo を表示

□バインド

次のようにすることで,変数へ値をバインドすることができます.

(#set
 x = 1
)
(p(x)) #=> 1

□条件分岐

条件分岐は次のように書きます.

( (a.> (10)) ?                   # 条件式
  (p("bigger than 10")) :        # THEN式
  (p("lower or equal than 10"))  # ELSE式
)

うーん,イマイチ.

_11(Wed)

僕は自分が思っていたほどは頭がよくなかった

おお.名文だ.


自分は,そういう方法を伝えられているんだろうか?

_10(Tue)

ずっとゼミ.

_9(Mon)

沢山寝てしまった.

_8(Sun)

プロシン3日目.無事に終了.

良いプロシンだったんじゃないかと思います.

_7(Sat)

プロシン2日目.ちょっと酒を飲んでしまった.

_6(Fri)

プロシン1日目.今年は調子が悪いので酒をほとんど飲まなかった.

_にしお(Sat Jan 07 14:51:46 +0900 2012)

 飲酒と起きていることが両立できなくなってきたので僕も飲まなかった

_5(Thu)

年末,体調不良のために行けなかった歯医者.


右腕が痛い.右腕の付け根が.年かなあ.

年末体調を崩してから,ずっと体の調子が悪い....

_4(Wed)

初自転車.お台場の船の科学館まで.30km くらい.年末はまったく運動できなかったので,体がなまりきってる感じ.

寒すぎる.ウインドブレーカー的なものが必須だった.関係無いけどウインドブレーカーって,なんか中二病ちっくな語感.

_3(Tue)

あれぇ,もう3日も過ぎてるの?

_2(Mon)

体の調子が戻らない.普通の時間に寝たり起きたりできないのがつらい.

_1(Sun)

明けました.

今年も平凡で幸せな一年でありますように.


この日記に2012年問題があり,cgi 弄るのが最初になってしまった.そろそろ本格的に次の探すか作るかするかね.

_にしお(Wed Jan 04 18:10:18 +0900 2012)

 ナイス書き初め!>cgi弄り

_ささだ(Thu Jan 05 08:02:18 +0900 2012)

 今時 cgi かよ! 的な.

Sasada Koichi / ko1 at atdot dot net
$Date: 2003/04/28 10:27:51 $