はじめに
実は最近、Rubyの勉強をチェリー本で始め、こないだ読み終えました。Rubyを学ぼうと決めた理由なんですが、とある名刺管理サービス会社のCTOの方がインタビュー記事で「エンジニアこそ事業にコミットすることが大切」「プロなら経済価値に直結するコードを書くべきだ」という記事を見つけ、めちゃめちゃ感銘を受けました。
で?ってなるんですが、実は日本のスタートアップや自社サービスを展開している企業のRuby(Rails)のシェア率・覇権がすごい!
つまり、長いものには巻かれろ!!ってことで、日本でRuby(Rails)を学べば、経済価値を生む機会が増えるんでないかと考えたわけです。
ちなみに僕はC# (ASP.NET MVC)を業務で使用しています。
動的型付言語と静的型付言語について
まず本題に入る前に大事なことがあります。それは言語のタイプです。
C#やJavaなどは静的言語、RubyやPHPは動的言語にカテゴライズされてます。
# Rubyhoge='動的言語です'// C#// 敢えて型推論varで宣言はしませんstringhoge="静的言語です";詳しい説明はしませんが、動的言語はstringなどの型の制約はない。
なのでRubyには静的言語でいうインターフェースがない。
↓のコードはC#。
publicinterfaceISearchUser{List<User>Find(Commandcommand);}publicclassSearchUserAppService{privateISearchUser_searchUser;publicSearchUserApp(ISearchUsersearchUser){_searchUser=searchUser;}publicList<User>Execute(){_searchUser.Find("Commandクラスは省略")}}静的言語でよくあるインターフェースを使用した抽象的なプログラムは出来ない。
これをRubyで書こうとすると ※クラスの書き方とかは後で説明します。
classSearchUserAppService#コンストラクタdefinitialize(searchUser)#@はインスタンス変数という。後で説明@searchUser=searchUserenddefExecute()@searchUser.Find("Commandクラスは省略")endendRubyのほうは、コンストラクタで渡されたオブジェクトがFindというメソッドを持っているか否かだけで実行かエラー判定をします。
これをダックタイピングというらしい。まあ「アヒルのように鳴けばそれはアヒルである」ってことらしい。
おしゃれな言い回しw ちなみに動的なので戻り値の型もない。。ここも後で説明
静的エンジニアが抑えておくポイント
やっと、本題に入ります。
今から説明する項目をインプットしていれば、最低限やっていけると思う。たぶん
変数宣言&コメント
# コメントname='itadori'age=1_bool=true# 配列array=[1,2,4]array=[1,'に',3]#こーいうのも出来る。アヒル強し# Hashplayer={'soccer'=>11,'baseball'=>9,'basketball'=>5}# 定数DEFULT_NAME='gozyou'Rubyでは変数宣言と代入を同時に行う必要がある。
コメントは#で可能
if分岐 & 戻り値
age=29ifage<30'20代です'else'20代ではないです'end# 結果格納もできるres=ifage<30'20代です'else'20代ではないです'endifの{}は使用しない。endで代用。三項演算子は一緒なので省略。
戻り値はコードの最終行が戻り値となる。この場合、文字列。
繰り返し
# 繰り返し処理numbers=[1,2,3,4,5]defarryEach(arry,sum)arry.each{|n|sum+=n}sumendarryEach(numbers,0)# => 15普通のforはほとんど使用しないらしい。eachメソッドで要素を1個ずつ取り出しnに代入する。まあforeachと一緒。
sumが最終行なので戻り値となる
メソッド
defmultpul(num)num+10enddefis_pass_code_review?(result)result=='LGTM'endメソッドはdefとendで記述する。
戻り値がtrueかfalseの場合、メソッド名に?を付ける。これも最終行が戻り値となる。明示的なreturnは使用しない。
クラス
classUser# getterattr_reader:name# コンストラクタdefinitialize(name)@name=nameend# インスタンスメソッドdefi_greeting()"Hello #{@name}"end# クラスメソッドdefself.c_greeting(name)"Hello #{name}"endend# インスタンスuser=User.new('miwachan')user.i_greeting()#=> Hello miwachan# クラスメソッドUser.c_greeting('pandasenpai')#=> Hello pandasenpai順を追って説明します。まずクラスはclassとendで記述します。コンストラクタはinitializeで定義します。
@ nameはインスタンス変数といいます。同インスタンス内で使用できる値です。
attr_reader はgetterのこと。わざわざ、getの処理を書かずに省略できる。
オブジェクト指向であれば基本的getterのみ使用するとおもうので他は説明しません。※setterのみとか色々あります。ググっててくれー
インスタンスメソッドはクラスをインスタンスしてから呼び出します。
クラスメソッドは少し勝手が違う。メソッド名にselfがついてると思いますがこれがクラスメソッドとなる。こいつはインスタンスせずにクラスから直接呼び出して使用する。静的言語のstaticに近い感じ。
モジュール
moduleSoundableprivatedefsound(s)"クラクション: #{s}"endendclassCarincludeSoundabledefmake_soundpsound('プップー')endendcar=Car.newcar.make_sound#= >クラクション:プップーRubyにはモジュールという概念がある。基本的にはクラスに近い。ただインスタンスは出来ない。
module endで記述する。使用したモジュールをクラスでincludeすれば使用できる。これをミックスインという。
includeすればインスタンスメソッド。extendでクラスメソッドになる。最初は気にしなくていいかも。
後、privateの修飾子が出てきたが、privateと記述した以降のメソッドがprivateになる。クラスも一緒。
色んな書き方があるので是非ググってほしい。p はただの出力メソッドだ。
その他
シンボル
hashira={:honoh=>'煉獄さん',:mizu=>'富岡',:mushi=>'胡蝶'}phashira[:honoh]# => 煉獄さん# こーいう書き方もできる. こっちのほうがメジャーっぽい。コロンの場所が変わるのに注意hashira={honoh: '煉獄さん',mizu: '富岡',mushi: '胡蝶'}phashira[:mushi]# => 胡蝶シンボルは「:文字列」の形になる。
用途としては、基本的にハッシュなどのキー値に使用することが多い。理由はシンボルは裏では整数として値を持っているようだ。なのでキー探索に向いており、探索を高速化できる。
配列操作系
numbers=[1,2,3,4,5,3]# map ※新しい配列を返す <<は配列に末尾追記defmapEach(arry,new_arry)arry.map{|n|new_arry<<n*10}endpmapEach(numbers,[])# selectpnumbers.select{|n|n.even?}# 偶数のみ摘出 [2,4]pnumbers.find{|n|n==3}# 最初に一致した要素を取得配列操作はどの言語でも高頻度で使用すると思う。とりあえず序盤で説明したeachとこの三つを覚えておけば何とかなるそう。※Railsをやってる先輩曰く
結論
やっぱり、ダックタイピングに慣れるのに時間がかかる静的型付エンジニアはいると思う。