LoginSignup
3

More than 5 years have passed since last update.

【ブロック引数を知る】config/environments/deveropment.rbって何してるの?

Last updated at Posted at 2016-03-01

概要

railsでは

config/environments/deveropment.rb

は、実行環境別の設定を持たせるようになっています。
その中で

deveropment.rb
Rails.application.configure do
  config.hoge = false
end`

↑のdo~endの意味が解らないので調べてみました。

  • do~end ってなってるし繰り返し処理なのかな?
  • でも、回してる値とか見当たらないし何じゃこりゃ?

というのが最初の感想でした(恥ずかしい)

標準出力で表示してみる

deveropment.rb
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行目を見てみると

railtie.rb
def configure(&block)
  instance_eval(&block)
end

ありました。こいつを呼んでるんですね。

この時点で思ったこと

  • rubyにもevalあるんだな
  • &blockって何?
  • method って do …end 付けると何が嬉しいの?

Evalってどんな感じなの?

まずはevalについて調べてみます

instance_eval (Object)

メソッドは、渡されたブロックをレシーバのインスタンスの元で実行します。

ふむふむ。ほかの言語にあるevalと似た感じ。(普段eval使わないから知らないけど)
与えられたStringをコードとして実行してくれるみたい。

ブロックって何?

[Ruby] ブロックやProcの使いどころを理解する

ありがたやありがたや。

do~end(もしくは{~})で囲われた、引数となるためのカタマリ。

なるほど、そもそもdo~endに対する理解を大いに間違えていたらしい。
今まで、do~endは繰り返し処理のためのコードの一部であって、引数とは一切思ってなかったけど、do~endで囲まれた中身はは引数になってたんですね。
[追記 頂いたコメントを反映しました]
forループのdo~endは制御構造で、ブロックではないそうです。
また、ブロックはメソッドに与えられますが、引数ではないそうです。
むー、難しい。

sample.rb
for num in 1..10 do
  p num
end

結論

というわけで

config/environments/deveropment.rb

がやってる事は、
config.hogeみたいな値の宣言をひたすらevalを使って定義してるだけということでした。

あー、すっきりした。

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
3