RrailsのソースのActiveSupport::Inflectorあたりを覗いた
ソースコードの整理
Railsのソースには、クラスだけじゃなくてモジュールに関数を組み込むのをよく見かけるのだけど、 golangのパッケージ的な感じで、複数のファイルにまたがって整理されたりしていた。クラス毎、モジュール毎という考えではなく、機能毎的な雰囲気。 普段このような整理はしないので、うっかり見落とすところだった。
rails/activesupport/lib/active_support/inflector at master · rails/rails · GitHub
クラス単位で整理したソースを基本書いてしまうんだけど、こういう整理の仕方もできるといいんでしょうねぇ。 メンテ力がないと酷い感じになる可能性も、予想されますけど、、、(どこに何がわかりづらくなる)
ActiveSupport::Inflectorの使い方
ActiveSupport::Inflectorを直接使うことはアプリ開発者側は基本なくて、String を拡張して使えるように提供されている。
rails/inflections.rb at master · rails/rails · GitHub
irb(main):001:0> "i_love_you".camelize => "ILoveYou" irb(main):003:0> "i_love_you".dasherize => "i-love-you" irb(main):004:0> "dog".pluralize => "dogs"
こんな感じで使える。
Concurrent::Map
rails/inflections.rb at master · rails/rails · GitHub
モジュール変数に、Concurrent::Map.new
というオブジェクトに変数を格納していってる。
実は一番最初にrubyを触ったのが、マルチスレッドを必要とするバックエンドシステムのデーモンを作ることだったので、
スレッドセーフの処理が必要だったのが、Mutex
を利用してlock的なソースを書いて実装していた。
Concurrent::Map を使ってもよかったかもですね。