パーフェクトRuby第2版を読んだ
パーフェクトRuby第2版を読んだので、軽く感想を書いておく
総評
さすがに結構知っていることが多かったものの、細かいところは勉強になった。
章ごとの感想
Part1 Ruby overview, Part2 Ruby言語仕様
だいたい知っている内容だった。 細かいところだが、caseのwhenにProcを使えるのは知らなかった。
FizzBuzzも
def fizz_buzz(n)
case n
when -> (n) { n % 15 == 0 }
'FizzBuzz'
when -> (n) { n % 3 == 0 }
'Fizz'
when -> (n) { n % 5 == 0 }
'Buzz'
else
nend
end
のように書ける。こんな風に書くことはないだろうが。
Thread, Fiberあたりの並行処理の話は今まであまり必要になったことがないので、勉強になった。
次の版では話題のGuildの話もはいってくるのだろうか。
Part3 メタプログラミング
恥ずかしながら(なのかどうかはよくわからないが)メタプログラミングRubyは読んだことがなく、メタプログラミングは普段あまりやらないので、結構知らないこと、もしくは今まであまり理解できていなかったことが書いてあった。ClassやModuleの構造を理解する上では非常に勉強になった。
そういえば、以下Animalモジュールのような動的なメソッド生成を行っているmoduleを見たことがある。DogではAnimalをextendして、define_animal_methods
を呼べばメソッドが展開されるという寸法である。
module Animal
def define_animal_methods
:name do |&block|
define_method puts 'animal_name'
.call if block
blockend
# define_methodが続く...
end
end
class Dog
extend Animal
define_animal_methodsend
Dog.new.name
#=> animal_name
ここで、展開先のClassにおいて、Animalの name
をoverrideするようなイメージで、 block.call
しているところにblockを渡して新しい name
メソッドにしたい。どうしたらいいだろうか。
自分は結果的には以下のように instance_method
で一旦退避させた上で、 define_method
で定義するような荒技を使った。
class Cat
extend Animal
define_animal_methods
= instance_method(:name)
_name
:name do
define_method .bind(self).() do
_nameputs 'cat_name'
end
end
end
Cat.new.name
# => animal_name
# cat_name
もっと簡単な方法があるような気もするが、どうだろうか。
また、関係ないが、 method_missing
を使ったこういうアプローチは面白いと思う。自分でも何か考えてみたい。
Part4 標準添付ライブラリ
こうしてみるとRubyはやはり標準の機能がかなり豊富だなと思う。
fileutilsなどのあまり使わないライブラリまわりは、覚えられないので必要になったら都度調べている。今回復習できたものの、また忘れたころに必要になるだろうなと思う。Setもごく稀に使うが、Arrayで事足りることが多いイメージがある。
Part5 実践プログラミング
gemを一度は作ったことがあり、なんとなく流れは知っているので、流し読み程度。
Ruby版Power Assertについても触れられているが、どのくらいユーザー数いるんだろうか。
最近読んだ他の本
最後に、パーフェクトRuby以外の本で最近読んで気になったものをあげておく。
- 実践AWS Lambda
- AWS Lambdaのチュートリアル的な本。
- SAMや周辺サービスにも言及している。
- 総ページ数に対してほぼスクリーンショットのページが多くて少し残念だった。
- 炎立つ
- 技術書ではない。奥州藤原氏の話で、岩手に引っ越したので読んでいる。
- まだ3巻の途中。
- 影響されてしまったのか、「感心しました」と言いたい場面で「感服仕った」が先に出てきて困った。