Ruby/Method/Procs
Материал из Wiki.crossplatform.ru
A Proc is an object that holds a chunk of code.
# The most common way to make a Proc is with the lambda method: hello = lambda do puts("Hello") puts("I am inside a proc") end hello.call # we will get # Hello # I am inside a proc
A quicker way to create our hello Proc
hello = lambda { puts("Hello, I am inside a proc") }
coax a method to convert an associated block to a proc on the fly.
# To do this, you need to create an argument to the method that is proceeded by an ampersand (&). #!/usr/local/bin/ruby def return_block yield end def return_proc( &proc ) yield end return_block { puts "Got block!" } return_proc { puts "Got block, convert to proc!" }
Proc object picks up the surrounding environment when it is created.
name = "John" proc = Proc.new do name = "Mary" end proc.call puts(name)
Ruby lets you store procedures or procs, as they"re called as objects, complete with their context.
# One way is to invoke new on the Proc class; # another way is to call either the lambda or proc method from Kernel. # calling lambda or proc is preferred over Proc.new because lambda and proc do parameter checking. #!/usr/bin/env ruby count = Proc.new { [1,2,3,4,5].each do |i| print i end; puts } your_proc = lambda { puts "Lurch: "You rang?"" } my_proc = proc { puts "Morticia: "Who was at the door, Lurch?"" } # What kind of objects did you just create? puts count.class, your_proc.class, my_proc.class # Calling all procs count.call your_proc.call my_proc.call
Use Proc.new, proc and lamda to create methods
#!/usr/local/bin/ruby count = Proc.new { [1,2,3,4,5].each do |i| print i end; puts } your_proc = lambda { puts "L?" } my_proc = proc { puts "?" } # What kind of objects did you just create? puts count.class, your_proc.class, my_proc.class # Calling all procs count.call your_proc.call my_proc.call
Use Proc.new to create a new method
log = Proc.new { |str| puts "[LOG] #{str}" } log.call("A test log message.") # [LOG] A test log message.
Use proc to create a function
hello = proc { "Hello" } puts hello.call