社内Ruby勉強会をやる。
note社内でRuby勉強会をやろうと思います。
いまさらですが新しく入社されるエンジニアの方にはRuby以外の言語から入ってくることもあるので改めて。
当記事ではRuby勉強会の趣旨と内容の一部抜粋して、何を目的として、何をゴールとして、どんなものか、お見せできればと思います。本記事でもって社内で参加者募ります。
目的
Rubyの要点を理解して、実務や習得の時間短縮を目的としてます。新しい言語なんて、1冊本読んで、コード書きまくってれば覚えるやろ。といえばそれはそうなんですが、本作Ruby勉強会は30分 * 6回の計3時間にまとめています。本一冊読むより早いのと、Rubyの慣習、クセ、良さ、楽しさも込めて伝えたいと思ってます。
ゴール
合計3時間でRubyプロフェッショナルを目指すものにしたいと思ってます。前提として他言語の習熟は必要ですが、それゆえに変数とは何か?オブジェクトは何か?という説明は省くことができます。
どんなものか一部抜粋してお見せします
前提
「Rubyはよく知らない」「他の言語を一定マスターしている」前提です。
1200行程度の.rbファイルでまとめています。
1冊の本が何行かよく知らないですがこれは10ページ分もないかと思います。
irbを起動します
$ irb
Rubyは動かしてなんぼのスクリプト言語です。各自動かしながら聞いて下さい。
## はじめに
(重要) Rubyでは予約語や記号、宣言など記述の多くがメソッドです。
# 四則演算記号も概ねメソッド
1 + 2 # + がメソッド
1 % 2 # % もメソッド
public # メソッド
User.new # newがメソッド
require 'csv' # requireがメソッド
# この場合、 +メソッドの第一引数が2になります。
1 + 2
arr = [1, 2, 3] # => [1, 2, 3]
arr[0] # => 1 []がメソッド、0が第一引数
arr[0] = 10 # []=がメソッド、0が第一、10が第二引数
つまり
arr.[]=(0, 10)
arr # => [10, 2, 3]
= 代入演算子はメソッドではない
ただし、hoge=メソッドが定義できる(後述)
/(0-9)*/ === '1234567890' #=> true
'1234567890' === /(0-9)*/ #=> false
なぜか?
Regex#=== は正規表現での比較。
String#=== という定義は無く。親クラスのObject#===が呼び出される
Object#=== の定義はただ ==メソッドの呼び出し
Hello World.
puts 'Hello Ruby'
メソッドのカッコは省略できます。
puts('hello world')
ともかけます。
引数がある場合は原則カッコをつけます。
でもputsは省略します。
宣言のようなメソッドの場合はカッコを省略します。
つまりつけたほうが読みやすいとか、かっこいいとか、そういうことです。
(最重要) Rubyはすべてオブジェクト
Javaでいうプリミティブ型というものが存在しません。
すべてラッパークラスのオブジェクトとして動作するといえばイメージつくのでしょうか。
'abc'.class => String
1.class => Integer
nil.class => NilClass
false.class => FalseClass
つまりNullPointerExceptionは発生しません
nil.count
=> undefined method `count' for nil:NilClass (NoMethodError)
Rubyでは純粋オブジェクト指向の仕様が徹底されていて、このルールに従っているという前提を真に理解することで、ほぼすべてわかった。あとは全部書ける。という気持ちになります。過言でしょうか?
数値
1.class #=> Integer
1.class.superclass #=>Numeric
1.class.superclass.superclass #=>Object
v2.4より前のバージョンでは桁数によってFixnumとBignumに分かれていましたが、Integerで統一されました。
互換性のためか定義は残っているのですが、桁数に関わらずtrueになるのでよくわかりません。
1.class == Fixnum #=> true
1.class == Bignum #=> true
1000000000000000.class == Fixnum #=> true
嘘ですわ。
Ruby3.2でついに定数もなくなりました。
Fixnum
=> uninitialized constant Fixnum (NameError)
1.methods #=> [:bit_length, :digits, :|, :lcm, :gcdlcm, :-@, :**, :<=>, :<<, :>>, :<=, :>=, :==, :===, :next, :[], :rationalize, :gcd, :upto, :chr, :%, :&, :*, :+, :inspect … その他色々
+ - * / などがあります。
文字列
'abc'.methods #=> とてもたくさんのメソッド
使ってれば覚えます。
'abc'.length #=> 3
'abc'.size #=> 3
賛否がわかれるかもしれませんが、Rubyには仕様として、慣習として、alias methodというものが存在します。別の名前の同じメソッドです。人によって使うメソッドが違うなど一般的に良くないケースもあるかと思われますが、個人的にはプログラムの表現力を高めていると思ってます。長さを表すlengthと大きさを表すsizeのように使い分けたり、単純にタイピングが短い方使ったり、あと絶対こんなメソッドあるやろと思ったらだいたいあるという気持ちよさを提供してくれます。
配列 ハッシュ 正規表現
略
シンボル
シンボルは任意の文字列と一対一に対応するオブジェクトです。
高速で効率的に機能する文字列というか。主にハッシュのキーに用いられます。
Range
1..10 # 1から10まで
1...10 # 1から9まで(10を除きます)
(0..3).each { |n| print "#{n.to_s}, " } #=> 0, 1, 2, 3,
# 終端を持たないRange
'abcdef'[2..] #=>"cdef"
# 始端を持たないRange
'abcdef'[...4] #=>"abcd"
# あまり使いどころがないように思えるが、Railsのクエリで<=などの表現に使われる
User.where(age: 18..)
## 制御構文
ifとかelseとか
世の中にはfor文というものがあるそうです。
Rubyでは使いません。
for e in arr
puts e
end
おわり
こちら極々一部抜粋です。
たった3時間とはいえそこそこのボリュームですね。
口頭のみで話す箇所も多数あるので、ぜひご参加ください。
Ruby初心者の方も、Rubyそこそこ書いてる方もぜひご参加ください。
新しい発見があるかもしれません。
この勉強会資料も見直したいと思いつつ、ナンバードパラメータの記述を追記した以来でしょうか?RubyOnRails版も作りたいですが、、、