Slide 1

Slide 1 text

1から始めるRuby kyoendo(a.k.a melborne) http://melborne.github.com

Slide 2

Slide 2 text

数学の世界で1は数である

Slide 3

Slide 3 text

3歳の⼦供でもそれを知っている

Slide 4

Slide 4 text

そして 私やあなたが⽼いて死にゆくまで

Slide 5

Slide 5 text

1は数であり そこに疑念の⼊る余地はない

Slide 6

Slide 6 text

プログラミングの世界でも ふつう1は数である

Slide 7

Slide 7 text

CでもJavaでもHaskellでも 1は数であり

Slide 8

Slide 8 text

それ以上でも それ以下でもない

Slide 9

Slide 9 text

ところが驚くべきことに

Slide 10

Slide 10 text

Rubyの世界では

Slide 11

Slide 11 text

1は数ではないのである

Slide 12

Slide 12 text

嘘だと思うなら irbを⽴ち上げて 次のようにしてみるといい

Slide 13

Slide 13 text

$ irb $ 1.next # => 2

Slide 14

Slide 14 text

あなたは今1に "next" というメッセージを送った

Slide 15

Slide 15 text

そうしたら1は 2という答えを返したのだ

Slide 16

Slide 16 text

つまりRubyの世界で1は 数以上のものであり

Slide 17

Slide 17 text

メッセージに返答する 「何か」である

Slide 18

Slide 18 text

Rubyの世界でそれは 「オブジェクト」 と呼ばれている

Slide 19

Slide 19 text

1はメッセージに反応する オブジェクトである

Slide 20

Slide 20 text

しかしここで⼀つの疑問が湧いてくる

Slide 21

Slide 21 text

それならば今 1が返した2というのは 何なのか

Slide 22

Slide 22 text

数なのか それとも オブジェクトなのか

Slide 23

Slide 23 text

この疑問にもirbが答えてくれる

Slide 24

Slide 24 text

$ irb $ 1.next.next # => 3

Slide 25

Slide 25 text

1からの返答にさらに "next"という メッセージを送ってみる

Slide 26

Slide 26 text

つまり "1.next"で返される2に メッセージを送ってみると

Slide 27

Slide 27 text

果たして 3が返ってきた

Slide 28

Slide 28 text

そう1から返答された2も やはりオブジェクトだったのだ

Slide 29

Slide 29 text

疑い深いあなたは これだけでは 納得しないかも知れない

Slide 30

Slide 30 text

そしてirbできっと 次のように ⼊⼒するのだろう..

Slide 31

Slide 31 text

$ irb $ 1.next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next.next \ .next.next.next.next.next.next.next.next.next # => 100

Slide 32

Slide 32 text

納得した?

Slide 33

Slide 33 text

そう Rubyの世界では ⼊り⼝も出⼝も

Slide 34

Slide 34 text

そのすべてが オブジェクトなのである

Slide 35

Slide 35 text

さて 1がオブジェクトなら "next"以外の

Slide 36

Slide 36 text

どんなメッセージに 反応するのかが 気になるところだ

Slide 37

Slide 37 text

Rubyではその答えも 1に聞けばいい

Slide 38

Slide 38 text

"methods" というメッセージを 1に送ってみよう

Slide 39

Slide 39 text

$ irb $ 1.methods $ => [:to_s, :-@, :+, :-, :*, :/, :em, :%, :modulo, :divmod,\ :fdiv, :**, :abs, :magnitude, :==, :===, :<=>, :>, :>=, :<,\ :<=, :~, :&, :|, :^, :[], :<<, :>>, :to_f, :size, :zero?,\ :odd?, :even?, :succ, :integer?, :upto, :downto, :times,\ :next, :pred, :chr, :ord, :to_i, :to_int, :floor, :ceil,\ :truncate, :round, :gcd, :lcm, :gcdlcm, :numerator,\ :denominator, :to_r, :rationalize, :singleton_method_added,\ :coerce, :i, :+@, :eql?, :quo, :remainder, :real?,\ :nonzero?, :step, :to_c, :real, :imaginary, :imag, :abs2,\ :arg, :angle, :phase, :rectangular, :rect, :polar,\ :conjugate, :conj, :between?, :nil?, :=~, :!~, :hash,\ :class, :singleton_class, :clone, :dup, :initialize_dup,\ :initialize_clone, :taint, :tainted?, :untaint, :untrust,\ :untrusted?, :trust, :freeze, :frozen?, :inspect, :methods,\ :singleton_methods, :protected_methods, :private_methods,\ :public_methods, :instance_variables,\ :instance_variable_get, :instance_variable_set,\ :instance_variable_defined?, :instance_of?, :kind_of?,\ :is_a?, :tap, :send, :public_send, :respond_to?,\ :respond_to_missing?, :extend, :display, :method,\ :public_method, :define_singleton_method, :__id__,\ :object_id, :to_enum, :enum_for, :equal?, :!, :!=,\ :instance_eval, :instance_exec, :__send__]

Slide 40

Slide 40 text

これらは 1が応答できる メッセージの集合で

Slide 41

Slide 41 text

Rubyでは 「メソッド」 と呼ばれている

Slide 42

Slide 42 text

つまり1は あなたからの問い合わせに対し これら130個もの メソッドで応答する

Slide 43

Slide 43 text

Rubyのクラス

Slide 44

Slide 44 text

上の説明を聞いて あなたは

Slide 45

Slide 45 text

「Rubyの1って天才、スゲー」 とつぶやいたに違いない

Slide 46

Slide 46 text

しかし事実はそうではない

Slide 47

Slide 47 text

実は1の中⾝は 私やあなたのあたまの中同様

Slide 48

Slide 48 text

ほとんど空っぽなのである

Slide 49

Slide 49 text

空っぽなのに1は これらのメッセージに 反応できるのである

Slide 50

Slide 50 text

このカラクリは難しいものではない

Slide 51

Slide 51 text

Rubyにおいて1は 先のメソッドの集合を 実際に持っているFixnumという クラスにリンクされている

Slide 52

Slide 52 text

そして1があなたからの メッセージを受け取ると それをFixnumに渡して

Slide 53

Slide 53 text

その返答が得られたら 1はそれをあなたに 返しているだけなのだ

Slide 54

Slide 54 text

つまり1は 「ググって」ばかりの 私やあなたと同じで

Slide 55

Slide 55 text

問い合わせのたびにただ 「クラスってる」だけで

Slide 56

Slide 56 text

Fixnumこそが Google同様の スゲー存在なのである

Slide 57

Slide 57 text

そして私やあなたは Webの世界では Rubyの1みたいな 存在なのである..

Slide 58

Slide 58 text

Ruby設計者が このような仕組みを採⽤した理由は 容易に想像がつくだろう

Slide 59

Slide 59 text

そうRubyでは 2も3も109も17320508も Fixnumというクラスに リンクしていて

Slide 60

Slide 60 text

これらの数に対する 問い合わせがあったときには すべてFixnumが 答えを⽤意しているのだ

Slide 61

Slide 61 text

そうすればこれらの数が それぞれ個別に 130個のメソッドを持つ 必要はなくなる

Slide 62

Slide 62 text

メソッド定義

Slide 63

Slide 63 text

Rubyで 「プログラミングをする」 というのは

Slide 64

Slide 64 text

「オブジェクトにメッセージを送る」 とほぼ同義である

Slide 65

Slide 65 text

⾃由で柔軟な プログラミングを 実現するため

Slide 66

Slide 66 text

Rubyの設計者は ⼤量の メソッドを⽤意した

Slide 67

Slide 67 text

しかし もちろんそれだけでは 真に⾃由なプログラミングが できるわけではない

Slide 68

Slide 68 text

独⾃メソッドが 定義できてこそ 本当のプログラミングが 実現できる

Slide 69

Slide 69 text

そしてRubyは それをあなたに許す

Slide 70

Slide 70 text

今あなたが 1に挨拶したら 返事がほしいとしよう

Slide 71

Slide 71 text

1の中⾝は空っぽで Fixnumクラスが メソッドを持っている ことを思い出そう

Slide 72

Slide 72 text

そうあなたのメソッドも Fixnumクラスに追加すればいい

Slide 73

Slide 73 text

class Fixnum def hello "Yo!" end end

Slide 74

Slide 74 text

さあ あなたから1に挨拶を!

Slide 75

Slide 75 text

$ 1.hello # => "Yo!"

Slide 76

Slide 76 text

もう少し気の利いた返事がほしいなら メッセージが別のオブジェクトを 受け取れるようにすればいい

Slide 77

Slide 77 text

class Fixnum def hello(name) "Yo! #{name}" end end

Slide 78

Slide 78 text

そしてあなたの名前を渡す

Slide 79

Slide 79 text

$ 1.hello("Charlie") # => "Yo! Charlie"

Slide 80

Slide 80 text

ここまでの説明が理解できたなら 挨拶に答えられるようになったのが 1だけではない ということが分かるだろう

Slide 81

Slide 81 text

$ 2.hello("Ken") # => "Yo! Ken" $ 24.hello("ジャック・バウアー") # => "Yo! ジャック・バウアー" $ 365.hello(365) # => "Yo! 365"

Slide 82

Slide 82 text

そう今や Fixnumクラスに属する すべての数字が

Slide 83

Slide 83 text

あなたが作った helloに答えられる!

Slide 84

Slide 84 text

先のコードの最後の式を⾒て ドキリとする⼈もいるかもしれない

Slide 85

Slide 85 text

メソッドに渡すオブジェクトを 「引数」と呼ぶけれども

Slide 86

Slide 86 text

渡されるものが オブジェクトである限り Rubyは それを引数として受け⼊れる

Slide 87

Slide 87 text

上の2つは ⽂字列のオブジェクトを 引数として渡し

Slide 88

Slide 88 text

最後のものは今まで⾒てきた 数のオブジェクトを渡している

Slide 89

Slide 89 text

すでにオブジェクトからの応答が オブジェクトであることを 理解したあなたなら

Slide 90

Slide 90 text

次のコードも理解できるだろう

Slide 91

Slide 91 text

$ 1.hello(2.hello("Ma")) # => "Yo! Yo! Ma"

Slide 92

Slide 92 text

$ at_exit { $ puts "Thank you for watching!" $ }