##Blocks and Procs(closures)
Blockはdo end で囲われた範囲のことで、そこでProc(procedure?)を決める。
メソッドとよく似ているが、メソッドは他のメソッドに渡せないのに対し、Procはメソッドに渡すことができる。
なぜならProcはobjectであり、メソッドは異なるため。
何回実行するのかといったprocの制御をmethodで記述するということができる。
同じ処理を繰り返す場合に使える。例えば、arrayに要素を追加していくなど。
また、methodにはblockだけを渡すことができる。
##hashes and symbol
hashはkey-valuenのペアである。
meal = { “egg” => “yum”
“rice” => "tasty",
“milk” => “goood”,
“miso-soup” => "juicy"
hashはkey value によって構成されているため、each文にてそれぞれ取り出すことができる。
meal.each do | key, value |
puts key, meal[key]
end
存在しないkeyを指定した場合 nil が返される。nilとは nothing at all の意味。
ただし、hashをhash constructor notation で定義する際、keyを決めておくとそのkeyが返される。
またnilとfalseは同じではなく、falseは not true の意。
###hashの作り方
hashは
・hash literal notation
new_hash = { ‘one’ => 1 } # => これのことをhash rocket と呼んでいるらしい。
・hash constructor notation
new_hash = Hash.new
に作られることが多い。
###symbol
key はstringの他にsymbolを用いて表記できる。symbolとは:symbolのように頭に:がつけられている。
stringとsymbolは異なるものである。
“example”.object_id != :example.object_id
ではsymbol key と string key の違いとは何か。hashにおいてはsymbolを用いることが推奨されている。
1. symbolは一度作られたら変更することができない。??
2. symbolのコピーは一度に一つだけ。よってメモリ使用を抑える。
3. symbol key は string key より早い 約2倍
string からsymbolへの変更は .to_sym またその逆は .to_s を用いて行われる。
to_symではなく.internを用いても良い。
######注意######
ruby 1.9 以降ではhashの作り方に変更が加えられ、jsやpythonのような表記をするようになった。
new_hash = {one:1,two:2}
hash内の要素を探す場合は.selectを使うことができる。
hash.select{|key,value| key == :someKey}
hash.select{|key,value| value < 100}
hashの他のmethodとしてはeach_key や each_value がある。
##The Zen of Ruby
if文を一列で書くことができる。trueならその文を実行する。
ternaryについて
if-else文を1行で書く方法。
? true-action : false-action
elsifの分岐が多岐にわたる場合はcase -when文を使用するのが良い。
case vatiable
when —
action
…..
else
end
conditional assignment ||=
variableの状態を判断して値を代入するかどうか決める。nilであれば代入し、すでにvalueを持っていれば何しない。
returnについて
method内の値を他でも使用する場合、returnを使用するが、何もreturnしないとどうなるか。
JSではundefined、pythonではNoneが返されるが、rubyは違う。method内で最後に行われた処理の結果が返ってくる。
ANDとOR内での処理の順番
基本的に左から順番に処理していく。orであれば左側がtrueならtrue、andであれば左がfalseであればreturn値が決定できるので処理が終わることになる。
.upto()と.downto()
例えば1~10までprintしたい場合は 1.upto(10){ |num| print num}と書くことで出力できる。
.respond_to?
something.respond_to?(:action)でsomethingにactionが行えるか調べられる。
<<
.pushや+の代わりに<<を用いて値を追加することができる。
stringに変数を代入する場合や、数値を代入する場合の表記は面倒くさい。
“ #{variable} ” と入力すると簡単!!
###modify
不要な語は省いて、短くする。rubyではreturnは必要ない。
if文、unless文は1行にまとめる。
for-loopによる同じアクションの繰り返しは.timesに変更。
.pushも<<に変更。
##Blocks, Procs,and Lambdas
###Blockとは
Blockはdo-endもしくは{ }によって囲まれた範囲のこと。.timesなどのメソッドが組み込める。
—blockへ使用される他のメソッド collect—
eachに似ている。arrayそれぞれの要素に処理を行う。collect は単にコピーを作る。上書きしたいのならcollect!を使用。
###Proc
rubyではほとんどがobjectである。 例外なのがblockで、そのために変数の保存ができない。そのためのprocがある。Procはsaved Blockと言われる。
ProcはProc.newと書くことで定義できる。Procを使うには単にmethodに渡せば良い。(頭に&をつけるとBlockとみなせる)
Procを利用することで、Blockの際は何度も書かねばならない処理を一つにまとめることができる。
yield やProc自体は.call methodにて呼び出すことができる。
—lambda—
lambdaはProcと同じくオブジェクト。
lambda {|param| block}で定義できる。
lambda Procと似ているが、lambdaが呼び出されたメソッドのreturnを優先するのに対し、Procはすぐreturnする