例えば設定ファイルの読み込みなど、ファイルを読み込んでパースするメソッドを作ることがよくあると思います。
class Config
def self.load(source)
source.each do |line|
parse(line)
end
end
end
Config.load(File.open("app.conf"))
Aさん「Config
クラスを使う側がわざわざファイルをopenするのも面倒なので、ファイル名だけ渡せばいいようにしよう」
Bさん「えっ、パースされる文字列を引数として渡したいよ!」
# Aさん案
Config.load("app.conf")
# Bさん案
Config.load("VAR_A=1\nVAR_B=10\n")
悩ましいですねえ。
Ruby的にはどちらが多いんでしょうか?
というわけで、今回はRubyの標準添付ライブラリから、引数にIOと文字列を取るメソッドを調べ、文字列を渡した場合に
- ファイルのパスとして解釈し、そのファイルを読み込む
- その文字列自体をパースする
のどちらが多いのか調べてみました。
CSVライブラリ
2.その文字列自体を処理する
CSV.new
は最初の引数にIOまたはStringをとり、文字列を渡すとCSV文字列として扱われます。
ファイル名を渡したい場合はCSV.open
やCSV.table
を使います。
JSONライブラリ
2.その文字列自体を処理する
JSON.load
が取る引数は、Stringまたはto_str
, to_io
, read
のいずれかのメソッドを持つオブジェクトです。
ファイル名からJSONを読み込むメソッドはないので、明示的にopenして渡さなければなりません。
YAMLライブラリ
2.その文字列自体を処理する
YAML.load
もStringまたはIOを引数に取り、StringはYAML文字列として解釈されます。
ファイル名から読み込むには、YAML.load_file
があります。
REXMLライブラリ
2.その文字列自体を処理する
rexmlには、XMLのパース方式によってREXML::Document.new
、REXML::Parser::PullParser.new
、REXML::Parser::SAX2Parser.new
など様々ありますが、全て引数にはStringかIO(またはその互換オブジェクト)をとり、StringはXML文字列とみなされます。
結論
圧倒的に 2. その文字列自体を処理する ですね!
こちらのほうがよりRubyらしいと言えるでしょうか