前回の記事 を書くにあたって 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
おお。できた。
0 件のコメント:
コメントを投稿
何かありましたら、どうぞ: