概要
railsでは
config/environments/deveropment.rb
は、実行環境別の設定を持たせるようになっています。
その中で
Rails.application.configure do
config.hoge = false
end`
↑のdo~endの意味が解らないので調べてみました。
- do~end ってなってるし繰り返し処理なのかな?
- でも、回してる値とか見当たらないし何じゃこりゃ?
というのが最初の感想でした(恥ずかしい)
標準出力で表示してみる
p "---------------------------"
p Rails.application.configure
p "---------------------------"`
まずは、こんな感じのをdeveropment.rbの先頭に追加して、rails s を実行
Exiting
c:/work/proto_waraiba/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/railtie.rb:210:in
`instance_eval': wrong number of arguments (0 for 1..3) (ArgumentError)
とエラーが出ました。
どうやらconfigureはメソッドらしいです。
で、railtie.rbの210行目を見てみると
def configure(&block)
instance_eval(&block)
end
ありました。こいつを呼んでるんですね。
この時点で思ったこと
- rubyにもevalあるんだな
- &blockって何?
- method って do …end 付けると何が嬉しいの?
Evalってどんな感じなの?
まずはevalについて調べてみます
メソッドは、渡されたブロックをレシーバのインスタンスの元で実行します。
ふむふむ。ほかの言語にあるevalと似た感じ。(普段eval使わないから知らないけど)
与えられたStringをコードとして実行してくれるみたい。
ブロックって何?
ありがたやありがたや。
do~end(もしくは{~})で囲われた、引数となるためのカタマリ。
なるほど、そもそもdo~endに対する理解を大いに間違えていたらしい。
今まで、do~endは繰り返し処理のためのコードの一部であって、引数とは一切思ってなかったけど、do~endで囲まれた中身はは引数になってたんですね。
[追記 頂いたコメントを反映しました]
forループのdo~endは制御構造で、ブロックではないそうです。
また、ブロックはメソッドに与えられますが、引数ではないそうです。
むー、難しい。
for num in 1..10 do
p num
end
結論
というわけで
config/environments/deveropment.rb
がやってる事は、
config.hogeみたいな値の宣言をひたすらevalを使って定義してるだけということでした。
あー、すっきりした。