Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Learn Ruby from One
kyoendo
September 02, 2012
Programming
8
26k
Learn Ruby from One
kyoendo
September 02, 2012
Tweet
Share
Other Decks in Programming
See All in Programming
OSSから学んだPR Descriptionの書き方
fugakkbn
4
130
OIDC仕様に準拠した Makuake ID連携基盤構築の裏側
ymtdzzz
0
550
Writing Greener Java Applications
hollycummins
0
340
Amebaブログの会員画面システム刷新の道程
ryotasugawara
1
230
Workshop on Jetpack compose
aldefy
0
140
Showkase、Paparazziを用いたビジュアルリグレッションテストの導入にチャレンジした話 / MoT TechTalk #15
mot_techtalk
0
110
What's new in Shopware 6.5
shyim
0
110
Excelの助けを借りて楽にシナリオを作ろう
rpa_niiyama
0
300
SHOWROOMの分析目的を意識した伝え方・コミュニケーション
hatapu
0
240
Gradle build: The time is now
nonews
1
470
10年以上続くプロダクトの フロントエンド刷新プロジェクトのふりかえり
yotahada3
2
340
ECテックカンファレンス2023
kspace
1
340
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
326
55k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
15
1.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
224
50k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
The Brand Is Dead. Long Live the Brand.
mthomps
48
2.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
109
16k
In The Pink: A Labor of Love
frogandcode
132
21k
The Illustrated Children's Guide to Kubernetes
chrisshort
22
42k
10 Git Anti Patterns You Should be Aware of
lemiorhan
643
54k
Atom: Resistance is Futile
akmur
256
24k
A Tale of Four Properties
chriscoyier
149
21k
Transcript
1から始めるRuby kyoendo(a.k.a melborne) http://melborne.github.com
数学の世界で1は数である
3歳の⼦供でもそれを知っている
そして 私やあなたが⽼いて死にゆくまで
1は数であり そこに疑念の⼊る余地はない
プログラミングの世界でも ふつう1は数である
CでもJavaでもHaskellでも 1は数であり
それ以上でも それ以下でもない
ところが驚くべきことに
Rubyの世界では
1は数ではないのである
嘘だと思うなら irbを⽴ち上げて 次のようにしてみるといい
$ irb $ 1.next # => 2
あなたは今1に "next" というメッセージを送った
そうしたら1は 2という答えを返したのだ
つまりRubyの世界で1は 数以上のものであり
メッセージに返答する 「何か」である
Rubyの世界でそれは 「オブジェクト」 と呼ばれている
1はメッセージに反応する オブジェクトである
しかしここで⼀つの疑問が湧いてくる
それならば今 1が返した2というのは 何なのか
数なのか それとも オブジェクトなのか
この疑問にもirbが答えてくれる
$ irb $ 1.next.next # => 3
1からの返答にさらに "next"という メッセージを送ってみる
つまり "1.next"で返される2に メッセージを送ってみると
果たして 3が返ってきた
そう1から返答された2も やはりオブジェクトだったのだ
疑い深いあなたは これだけでは 納得しないかも知れない
そしてirbできっと 次のように ⼊⼒するのだろう..
$ 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
納得した?
そう Rubyの世界では ⼊り⼝も出⼝も
そのすべてが オブジェクトなのである
さて 1がオブジェクトなら "next"以外の
どんなメッセージに 反応するのかが 気になるところだ
Rubyではその答えも 1に聞けばいい
"methods" というメッセージを 1に送ってみよう
$ irb $ 1.methods $ => [:to_s, :
[email protected]
, :+, :-,
:*, :/, :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, :
[email protected]
, :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__]
これらは 1が応答できる メッセージの集合で
Rubyでは 「メソッド」 と呼ばれている
つまり1は あなたからの問い合わせに対し これら130個もの メソッドで応答する
Rubyのクラス
上の説明を聞いて あなたは
「Rubyの1って天才、スゲー」 とつぶやいたに違いない
しかし事実はそうではない
実は1の中⾝は 私やあなたのあたまの中同様
ほとんど空っぽなのである
空っぽなのに1は これらのメッセージに 反応できるのである
このカラクリは難しいものではない
Rubyにおいて1は 先のメソッドの集合を 実際に持っているFixnumという クラスにリンクされている
そして1があなたからの メッセージを受け取ると それをFixnumに渡して
その返答が得られたら 1はそれをあなたに 返しているだけなのだ
つまり1は 「ググって」ばかりの 私やあなたと同じで
問い合わせのたびにただ 「クラスってる」だけで
Fixnumこそが Google同様の スゲー存在なのである
そして私やあなたは Webの世界では Rubyの1みたいな 存在なのである..
Ruby設計者が このような仕組みを採⽤した理由は 容易に想像がつくだろう
そうRubyでは 2も3も109も17320508も Fixnumというクラスに リンクしていて
これらの数に対する 問い合わせがあったときには すべてFixnumが 答えを⽤意しているのだ
そうすればこれらの数が それぞれ個別に 130個のメソッドを持つ 必要はなくなる
メソッド定義
Rubyで 「プログラミングをする」 というのは
「オブジェクトにメッセージを送る」 とほぼ同義である
⾃由で柔軟な プログラミングを 実現するため
Rubyの設計者は ⼤量の メソッドを⽤意した
しかし もちろんそれだけでは 真に⾃由なプログラミングが できるわけではない
独⾃メソッドが 定義できてこそ 本当のプログラミングが 実現できる
そしてRubyは それをあなたに許す
今あなたが 1に挨拶したら 返事がほしいとしよう
1の中⾝は空っぽで Fixnumクラスが メソッドを持っている ことを思い出そう
そうあなたのメソッドも Fixnumクラスに追加すればいい
class Fixnum def hello "Yo!" end end
さあ あなたから1に挨拶を!
$ 1.hello # => "Yo!"
もう少し気の利いた返事がほしいなら メッセージが別のオブジェクトを 受け取れるようにすればいい
class Fixnum def hello(name) "Yo! #{name}" end end
そしてあなたの名前を渡す
$ 1.hello("Charlie") # => "Yo! Charlie"
ここまでの説明が理解できたなら 挨拶に答えられるようになったのが 1だけではない ということが分かるだろう
$ 2.hello("Ken") # => "Yo! Ken" $ 24.hello("ジャック・バウアー") # =>
"Yo! ジャック・バウアー" $ 365.hello(365) # => "Yo! 365"
そう今や Fixnumクラスに属する すべての数字が
あなたが作った helloに答えられる!
先のコードの最後の式を⾒て ドキリとする⼈もいるかもしれない
メソッドに渡すオブジェクトを 「引数」と呼ぶけれども
渡されるものが オブジェクトである限り Rubyは それを引数として受け⼊れる
上の2つは ⽂字列のオブジェクトを 引数として渡し
最後のものは今まで⾒てきた 数のオブジェクトを渡している
すでにオブジェクトからの応答が オブジェクトであることを 理解したあなたなら
次のコードも理解できるだろう
$ 1.hello(2.hello("Ma")) # => "Yo! Yo! Ma"
$ at_exit { $ puts "Thank you for watching!" $
}