ちょっとしたクロージャの勉強

今日は,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の動きは正直理解できないけど,少しずつ,少しずつ理解していくぞ.