ちょっとしたクロージャの勉強
今日は,http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closureを見ながら,クロージャの勉強です.
折角良い例を示してくれているので,簡単なemployeeライブラリ(?)を書いてみました.
class Employee def initialize(name,isManager,salary) @name = name @isManager = isManager @salary = salary end attr_reader:name attr_reader:isManager attr_reader:salary end def manager(emps) return emps.select{ |e| e.isManager} end def highPaid(emps) threshold = 250 return emps.select { |e| e.salary > threshold} end def paidMore(amount) return Proc.new {|e| e.salary > amount} end
それでは,参考通りの動きをしてくれるか,irbで実行してみましょう.
irb(main):001:0> require 'employee' => true irb(main):002:0> emps = [] => [] irb(main):003:0> emps[0] = Employee.new("noa",false,200) => #<Employee:0x5fbe0 @salary=200, @isManager=false, @name="noa"> irb(main):004:0> emps[1] = Employee.new("gotou",true,320) => #<Employee:0x59e84 @salary=320, @isManager=true, @name="gotou"> irb(main):005:0> emps[2] = Employee.new("asuma",false,210) => #<Employee:0x55f28 @salary=210, @isManager=false, @name="asuma"> irb(main):006:0> emps[3] = Employee.new("nagumo",true,300) => #<Employee:0x51eb4 @salary=300, @isManager=true, @name="nagumo">
- 野明の給料は200万で,管理者じゃない
- 後藤隊長の給料は320万で,管理者
- 遊馬の給料は210万で,管理者じゃない
- 南雲さんの給料は300万で,管理者
それぞれを,empsという配列に格納.型が自由ってのが,ホント良いよね.まぁ初期設定はこんな感じでいいでしょうか.
それでは,不思議の国へご招待.
irb(main):007:0> manager(emps) => [#<Employee:0x59e84 @salary=320, @isManager=true, @name="gotou">, #<Employee:0x51eb4 @salary=300, @isManager=true, @name="nagumo">]
おぉ,ちゃんとisManagerがtrueなのが返ってきてます.素敵.
irb(main):008:0> highPaid(emps) => [#<Employee:0x59e84 @salary=320, @isManager=true, @name="gotou">, #<Employee:0x51eb4 @salary=300, @isManager=true, @name="nagumo">]
おぉ,高給取りもちゃんと返ってきてます.さて,お次はもっと不思議なProcの登場.
irb(main):009:0> highPaid = paidMore(250) => #<Proc:0x00065eb4@./employee.rb:23> irb(main):010:0> highPaid.call(emps[0]) => false irb(main):011:0> highPaid.call(emps[1]) => true irb(main):012:0> highPaid.call(emps[2]) => false irb(main):013:0> highPaid.call(emps[3]) => true
うわぁ,なんかもう,不思議としか言い様が無い働きですね.ちゃんと,参考通りに出来ました.Procの動きは正直理解できないけど,少しずつ,少しずつ理解していくぞ.