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