まさ@ブログ書き込み中

まさ@ブログ書き込み中

まさの旅、英語、プログラミング、プライベートについて、色々記録しています。

福地から学んだymlのお話

 

こんにちは、まさです。

 

僕が開発したMINEですが、ローカルにあるMySQLに接続する際にdatabase.ymlというファイルを使いました。

 

以下のリポジトリの「db」ファイルの中にあります。

github.com

 

実は、同じチームの福地がdatabase.ymlでローカルのMySQLに接続できないという問題に直面していました。

 

yuki-f-oki.hatenablog.com

 

原因は以下のようなものだったらしいです。

 

原因は 

①developmentをクオーテーションで囲っていること

②database.ymlの中でインデントをちゃんとしなかったこと

 

興味深い。なんでインデントの有無やクオーテーションで囲っていたりシンボルで書いていたりすることがymlとActiveRecordのestablish_connectionに関係するのか。

 

というわけで調べてみました。

 

 

ダブルクオーテーションで囲むこととシンボルで書くことの違い

このサイトを参考にしました。

qiita.com

 

この方のまとめによると、文字列とシンボルの違いは

文字列

その名の通り文字の列。文字列自体がデータであるときに使う。
たとえば氏名とか住所とかメッセージとか。

シンボル

文字列の皮を被った数値。コード上は文字列で見えてるけど内部では数値として扱われる。比較、検索に関して速度面で有利なので、主にデータの名前に使うと吉。
たとえばハッシュのキーだったり、メソッドに渡すクラス名/メソッド名/変数名/定数名だったりとか。ステータス名なんかも、文字列自体がデータではないのでシンボルを使うとよさげ。

補足としては、
- クラス名/メソッド名/変数名/定数名は定義すると勝手にシンボルを作って検索に備えている。
- シンボルの名前と数値は一対一対応なので、何回書いてもオブジェクト数が増えずメモリ的におトク。
- シンボルの名前はimmutable (変更不可)。でも、だからといって変更不可の文字列として使うのはちょっと違う。その場合はString#freezeでも使うといい。

 

だそうな。なるほど。シンボルは表示することはなく、何かを検索したり指し示したりする際に使われますね。だからハッシュのキーだけでなくクラス名・メソッド名・変数名・定義名も勝手にシンボルとして作られている。

 

例えば以下のようにコードを書いたとします。

 

def hello(name)

 puts "Hello, #{name}!"

end 

 

このメソッドを呼び出す際に僕らは普通にこう書きますね。

 

hello(masa)

# => "Hello, masa!" と表示

 

この「hello」は別にこのテキスト自体に意味はありません。helloでもaisatsuでもgreetでも良いわけですね。このような文字列は勝手にシンボル(上の記事の著者の言葉を借りると「文字列の皮を被った数値」)として処理されるわけですね。

 

一方、文字そのものをデータとして保持しておく必要がある文字列は、そのままデータとして扱われるというわけですね。 

 

 

YAMLとは構造化データの表現方法で、インデントでデータの階層構造を表す

このサイトを参照しました。

qiita.com

 

 

このサイトによると、yaml

 

  • 読みやすく・書きやすく・わかりやすいという特徴がある
  • インデントを使ってデータの階層構造を表す
  • 終了タグが存在しない
  • データ構造をハッシュ・配列・スカラーの三種類で表す 

 

という特徴があるそうな。

 

ここで、福地の言っていた解決策の意味がわかります。彼はデータベース接続ができなかった原因を

 

①developmentをクオーテーションで囲っていること

②database.ymlの中でインデントをちゃんとしなかったこと

 

 と言っていました。

 

つまり、データベースに関する情報をyamlで表記するからインデントをyamlのルールに従ってつける必要があったし、それらの構造はハッシュ(正確にはハッシュの中にハッシュがある)で表記されているため、シンボルである必要があったのですね。

 

 

まとめ

例にならってまとめます。

  • シンボルは文字列の皮を被った数値
  • 文字列は数値化されずそのままデータとして扱われる
  • yamlはインデントでデータの階層構造を表し、配列やハッシュ、スカラーで表している
  • だから福地はデータベースに接続できなかった

のでした。

 

終わり。