これまでずっと適当にRubyのコードを読んだり書いたりしてたけど、まあ普通に効率悪いし、capistranoとかvagrantとかserverspecとかを使っているわけだから、Rubyの勉強をしようと思い立った。とりあえず良さそうな本なんかないですかって聞いたら、初めてのRuby読んでみるといいですよって言われたので読んだ。
かなり面白かった。特に
- プログラミング初級者を対象とせず、他の言語を知っている人がシンプルにとりあえず知りたいことを知れる
- 書き方だけでなく、ちょっとしたRuby文化みたいなのも知れる
- Rubyの特徴的な書き方みたいなところがざっと把握できる
というところが良かった。
興味深い・よく分からなかったなどのことを書いてみる。
文字エンコーディング
*による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クラスのインスタンスみたいになるんだろうか。