ただいま整理中。
Blogspot (Blogger?) に移行しました!
タイムライン | 技術系 | TIPS | ライフハック系 | その他 | 左記カテゴリ以外は、右の欄の下のタグクラウドへ!
.

2014年05月19日

brew のバージョンに関する部分のソースを読んでみた
カテゴリ: 技術 | タグ: 定数 String ruby

※[ブックマーク]ボタンの中に delicious, reddit, digg, Google+(G+) のボタンもあります。

前回の記事 を書くにあたって CLT のバージョンの調べ方について調査し、パッケージ管理ツールのひとつである Homebrew による CLT バージョンの取得方法について、github のソースを探索したときのログです。

String#[/re/], extend を使ったモジュールのメソッド定義、定数のエイリアスといった、ちょっとおもしろい記述方法を見つけました。




《スポンサードリンク》

解析ログ

brew --config コマンドがどのように CLT のバージョンを調べているのか、調査する。

(CLT には、standalone と Xcode のふたつのバージョンがある。?)

そこで com.apple.pkg.DeveloperToolsCLI で検索すると、下記が見つかる:

GitHub にある Homebrew のコードからだと、Library/Homebrew/os/mac/xcode.rb
あたりかな:

      def detect_version
        [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID].find do |id|
          version = MacOS.pkgutil_info(id)[/version: (.+)$/, 1]
          return version if version
        end
      end

パッケージ ID を幾つか指定して調べてるわけか。

モジュール・メソッドの (Mac|MacOS).pkgutil_info は、Library/Homebrew/os/mac.rb の l. 238 にある:

    def pkgutil_info(id)
      (@pkginfo ||= {}).fetch(id) do |key|
        @pkginfo[key] = `/usr/sbin/pkgutil --pkg-info "#{key}" 2>/dev/null`.strip
      end
    end

ふむ。というか、String#[/re/] なんてメソッドがあるんだねぇ……。
String#slice とか String#scan と似たようなもんか。

あと、Homebrew のソース見てて思ったことは:

>> module Foo
>>   extend self
>>   def bar; puts "yada"; end
>> end
=> nil
>> Foo.bar
yada
=> nil
>> Foo.singleton_methods
=> [:bar]
>> Foo.instance_methods
=> [:bar]

こんな書き方ができるわけ。へー。いままで、def self.bar とか、もっとまわりくどい書き方してました。そうすると、module_function って、要らなくないかw?

この定数の定義の仕方もおもしろい:

>> module Foo
>>   module Bar
>>     extend self
>>     ::FooBar = self
>>     def gar; puts "garrr"; end
>>   end
>> end
=> nil
>> Foo::Bar.gar
garrr
=> nil
>> FooBar.gar
garrr
=> nil

Foo::Bar の階層化された定数のエイリアスを作れるわけだね。ということは、当然こういう書き方も……

>> G=Foo::Bar
=> Foo::Bar
>> G.gar
garrr
=> nil

おお。できた。



タグ:定数 String ruby
posted by もふもふ at 17:58 | ロンドン 🌁 | Comment(0) | TrackBack(0) | カテゴリ: 技術 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
トラックバックURLは,"Trackback(x)"のリンクを押すと表示されます.
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。