LoginSignup
2
0

More than 5 years have passed since last update.

ファイル読み込みのメソッドに、IOオブジェクトの代わりに文字列を渡した場合の挙動

Last updated at Posted at 2018-06-08

例えば設定ファイルの読み込みなど、ファイルを読み込んでパースするメソッドを作ることがよくあると思います。

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と文字列を取るメソッドを調べ、文字列を渡した場合に

  1. ファイルのパスとして解釈し、そのファイルを読み込む
  2. その文字列自体をパースする

のどちらが多いのか調べてみました。

CSVライブラリ

2.その文字列自体を処理する

CSV.newは最初の引数にIOまたはStringをとり、文字列を渡すとCSV文字列として扱われます。
ファイル名を渡したい場合はCSV.openCSV.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.newREXML::Parser::PullParser.newREXML::Parser::SAX2Parser.newなど様々ありますが、全て引数にはStringかIO(またはその互換オブジェクト)をとり、StringはXML文字列とみなされます。

結論

圧倒的に 2. その文字列自体を処理する ですね!
こちらのほうがよりRubyらしいと言えるでしょうか

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0