くりにっき

フルスタックキュアエンジニアです

パーフェクトRubyを読んで気づいたことをまとめた

渋谷.rbで橋立先生(id:joker1007)からサインをいただいて感想を書いてないことを思い出したので、読んでる時に書きためていたメモをまとめてみます。

Enumerable#each

succ が定義されているクラスじゃないと each できない (Range が内部的に succ を呼んでいるため)

2.0.0p247 :001 > 1.succ
 => 2
2.0.0p247 :002 > "a".succ
 => "b"
2.0.0p247 :003 > (1.0).succ
NoMethodError: undefined method `succ' for 1.0:Float
  from (irb):3
  from /Users/sue445/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>'

Enumerable#grep と Enumerable#select

違いがよく分からなかったのだけど、 grep が値を評価して select がブロックを評価するという認識でおk?

2.0.0p247 :001 > %w(Heart Diamond Rosetta Sword Ace).grep(/r/i)
 => ["Heart", "Rosetta", "Sword"]
2.0.0p247 :002 > %w(Heart Diamond Rosetta Sword Ace).select{|str| str =~ /r/i }
 => ["Heart", "Rosetta", "Sword"]

Enumerator

外部イテレータを使えば2つ以上の配列を同時に回せる

people = %w(Heart Diamond Rosetta Sword Ace).to_enum
ages   = [14, 14, 14, 14, 10].to_enum

loop do
  person = people.next
  age    = ages.next
  
  puts "#{person} (#{age})"
end #=> Heart (14) Diamond (14) Rosetta (14) Sword (14) Ace (10) を順番に表示

Set

Set#add?Set#delete? の戻り値はbooleanでは ない

追加(削除)できた場合には変化後の集合を返し、追加(削除)できなかった場合にはnilを返す

RubyGems

gemの挙動を調べるためにデバッグコードを仕込んでも gem pristine で元に戻せる

Bundler

  • bundle gem -b でbin/ を作成
  • bundle gem -t でspec/ を作成。
    • .travis.yml も生成するとかマジか。。。
  • capistranoやsimplecovみたいにアプリ側でrequireしないものはGemfileでrequire: false しておく
gem "capistrano", require: false

Capistrano

beforeafter 以外にもhookがあった http://rubydoc.info/github/capistrano/capistrano/master/Capistrano/Configuration/Callbacks

YARD

RDocも便利なんですが、柔軟性がありすぎてフォーマットがあまり統一されていないのが難点。(自分で書いてても結構ぶれるw) 自分がJavaの人だからというのもありますが、タグをつけるYARDの方が書きやすかったです。

ところでメソッドの戻り値が特定のフォーマットの Hash の場合ってどう書けばいいでしょ?*1

  # @return [Hash] 下記のようなHashを返す
  # @example 戻り値のサンプル
  #   {
  #     name1: value1 # 1つ目の説明
  #     name2: value2 # 2つ目の説明
  #     name3: value3 # 3つ目の説明
  #   }
  #

こんなんでいいものなのかどうか。うぅむ。

サイン本

∩( ・ω・)∩

橋立先生からパーフェクトRubyにサインもらった! #shibuyarb

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

*1:Javaだとレスポンス用のクラスを作るのでそのクラスに対してJavaDocを書くためメソッドの方のJavaDocには何も書かなかった