Diary

Diary?

学生の研究日記だったらしいです。多分。

拍拍日記。

いちばんあたらしいの2012 1/27 9:29

_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式
)

うーん,イマイチ.

Log

2002 01 02 03 04 05 06 07 08 09 10 11 12
2003 01 02 03 04 05 06 07 08 09 10 11 12
2004 01 02 03 04 05 06 07 08 09 10 11 12
2005 01 02 03 04 05 06 07 08 09 10 11 12
2006 01 02 03 04 05 06 07 08 09 10 11 12
2007 01 02 03 04 05 06 07 08 09 10 11 12
2008 01 02 03 04 05 06 07 08 09 10 11 12
2009 01 02 03 04 05 06 07 08 09 10 11 12
2010 01 02 03 04 05 06 07 08 09 10 11 12
2011 01 02 03 04 05 06 07 08 09 10 11 12
2012 01 02 03 04 05 06 07 08 09 10 11 12

SASADA Koichi (ko1 at atdot dot net) / Skype ID: ko1_ssd


rss