Blockについて
ものすごい解りやす買ったのが以下の記事
https://qiita.com/kidach1/items/15cfee9ec66804c3afd2
ブロックとは、
do~end(もしくは{~})で囲われた、引数となるためのカタマリ。
block.rb
def give_me_block
yield
end
give_me_block do
p "Hello"
end
#=> "Hello"
上を明示的に書くと下になる。
explicit_block.rb
def give_me_block(&block) ##&blockの&は入ってきた引数をProcオブジェクトに変更するためのもの
block.call
end
give_me_block do
p "Hello"
end
#=> "Hello"
ブロック、プロックの理解
more.rb
#1
def magic_five_box(after_input, someProc)
someProc.call(5, after_input)
end
#2
sum_proc = Proc.new do |x, y|
p x + y
end
#3
magic_five_box(3, sum_proc)
#=> 8
1 では、magic_five_boxを定義している。
2で、 sum_procは、x,yを仮引数とするブロックである。(仮引数は、変数みたいなイメージ)
3でsum_procというブロックをmagic_five_boxのsomeProcに実引数として渡している。
4, sum_procオブジェクト内の p x+y が.call(5, 3)で5と3を実引数として実行される。
Rubyの変数について
Rubyのローカル変数は、その階層で閉じるというのが肝。Javaとかだと、上位層で定義されたローカル変数は、下位層でも使えるが、Rubyの場合は、あるスコープで定義されたローカル変数は、下位層だろうが上位層だろうが、そのスコープ内でしか使用できない。
Rubyのインスタンス変数については、基本は、定義したスコープ内で初期化して使うものだが、そのスコープ外で呼び出したい場合は、attr_accesorを使うことで、その変数に変更を加えたり、初期化したりすることができる。
Rubyのクラス変数については、なんのためやねん?-> 確認