$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

初めてのRubyを読んだ

 これまでずっと適当にRubyのコードを読んだり書いたりしてたけど、まあ普通に効率悪いし、capistranoとかvagrantとかserverspecとかを使っているわけだから、Rubyの勉強をしようと思い立った。とりあえず良さそうな本なんかないですかって聞いたら、初めてのRuby読んでみるといいですよって言われたので読んだ。

 かなり面白かった。特に

  • プログラミング初級者を対象とせず、他の言語を知っている人がシンプルにとりあえず知りたいことを知れる
  • 書き方だけでなく、ちょっとしたRuby文化みたいなのも知れる
  • Rubyの特徴的な書き方みたいなところがざっと把握できる

というところが良かった。

 興味深い・よく分からなかったなどのことを書いてみる。

文字エンコーディング

 さまざまな言語で文字エンコーディングはハマりどころだが、Rubyは分かりやすいという感じだった。

  • とりあえず外部から読み込んだり書き込んだりする時のエンコーディングと、内部で使ってるエンコーディングだけ考えてればなんとかなりそう
  • 変に自動で変換とかされないので良い
  • マジックコメントみたいなので内部エンコーディングのデフォルト変えられるの面白い
    • ただ、いくつかのproject grepしたけどあんまり使われないのかなと思った
    • そもそも最近のRubyはdefault utf8だしあんま問題ないのかも

参考: Rubyのエンコーディング - tmtms のメモ

*によるArray展開

 この部分かなり難しかったし、理解もまだちゃんと出来てない。例えば以下のようなコードの場合、それぞれでどういうことが起きているんだろうかという部分がわからなかった。

a1 = [1, 2] # 普通にArrayが入りそう
p a1

a2, b2 = [1,2] # 一番トップは()が省略されても良い?
p a2, b2

a3, (b3, c3), d3 = [1, [2, 3], 4] # 括弧を左に書くとその部分のArrayが展開される?
p a3, b3, c3, d3

a4, b4, *c4 = [1, 2, 3, 4] # 左辺に*を書くとそれ以降がArrayとして入る
p a4, b4, c4

# a4, b4, *c4 = *[1, 2, 3, 4] こう書いても同じ。*は何をするんだろ。Arrayを展開して何にしてるんだろ。

a5 = 1,2,3 # これは*[1,2,3]と同じ書き方なんだろうか
p a5

def some_method
  # returnはArrayにしてから返すんだろうか
  # それとも多値みたいなのを単に返してるだけで変数に入れた時にArrayになるんだろうか
  # perlのリストと配列みたいの違いがあるんだろうか
  return 1,2,3
end

a6, b6 = some_method
p a6, b6


a7, b7, c7 = *[*[1,2,3]]
p a7, b7, c7

array1 = [1,2,3]
array2 = *array1 # こうすると配列コピーぽかった
p array1
p array2
p array1.equal?(array2) # => false

 というかPerlもリストと配列という違いがあって分かりにくいんだけど、Rubyも実は内部的にはこういうのがあったりするんだろうか。http://togetter.com/li/263729

特異メソッド・特異クラス

 こういうのがマジカルな文法ではなく普通に提供されるのは面白いなと思った。

 あとクラスメソッドが特異メソッドの一種というのが興味深い。classリテラルで定義すると内部的にはClassクラスのインスタンスみたいになるんだろうか。

まだ分かってないこと

 Rubyの書き方・文化とかは入門できたとは思うんだけど、実際にはこう書くよねとか、最近はこういう書き方しないよねみたいなのはまだわからないなーという感じだった。例えば

  • forはあるけど、Ruby的にはeachを使う
  • classメソッド定義する時は(クラス名).(メソッド名)とself.(メソッド名)の二つの書き方あるけどselfを基本は使うとか

 最近のベストプラクティスが知りたい。

 あとテストの書き方とか、プロジェクトのよくある構成(ディレクトリ名とか)がよく分からなかったので、これから勉強していかないといけない気がする。

まとめ

 とりあえずRuby入門が出来た気がする。次は定番projectのコードリーディングとか、自分でやりたいことやってみるとかすればいいんだろうか。ソースコードリーディングに良いRubyのプロジェクト知りたい。