Open9
【読書メモ】Ruby コードレシピ集
読んでいき
エンドレスメソッド定義
知らなかった、こう書けるのね
def square(x) = x * x
Obejct#tap
地味に知らなかったやつ。デバッグとか使えそう
(1..10) .tap {|x| puts "original: #{x}" }
.to_a .tap {|x| puts "array: #{x}" }
.select {|x| x.even? } .tap {|x| puts "evens: #{x}" }
.map {|x| x*x } .tap {|x| puts "squares: #{x}" }
なるほど、こういうケースで便利だ
レシーバーを返却しないメソッドにレシーバーを返却させたい
tap未使用
customer_model = CustomerModel.new(params) customer_model.save # saveの返り値はtrue/false customer_model.id
tap使用
CustomerModel.new(params).tap(&:save).id
Object#then
これも便利ね。似たケースでBeforeみたいな書き方したことあったな、今後はthen使ってスマートに書こう
Before
str = 'https://api.example.com'
url = URI.parse(str)
res = Net::HTTP.get(url)
json = JSON.parse(res)
puts json['description']
After
puts 'https://api.example.com'
.then { |str| URI.parse(str) }
.then { |url| Net::HTTP.get(url) }
.then { |res| JSON.parse(res) }
.then { |json| json['description'] }
Refinement
使う機会があるかはさておき、どうしてもモンキーパッチが必要な場面に遭遇したら思い出そう
Object#send
こういう観点も考慮されとるんやなぁ
send が再定義された場合に備えて別名
__send__
も用意されており、ライブラリではこちらを使うべきです。また__send__
は再定義すべきではありません。
後置rescue
これまた使う機会があるかはさておき、地味に知らなかった
open("nonexistent file") rescue STDERR.puts "Warning: #$!"
ensure
JavaScriptのtry...catchでいう finally
ね。使う機会なくて覚えてなかった
begin
do_something
rescue
recover
ensure
must_to_do
end