inf:ruby:procs
Proc
Proc
to anonimowa funkcja lub blok kodu,
do metody można przesłać tylko jeden blok kodu, ale wiele Proc
ów,
Proc.new
, jeśli nie poda mu się żadnych argumentów, przeszuka zakres zmiennych lokalnych danej metodzie:
#!/usr/bin/env ruby -wKU
def run_block
p = Proc.new
p.call
end
run_block do
puts "Hi, Marek!"
end
# Output
Hi, Marek!
Proc
może być wywołany na kilka sposobów:
proc = Proc.new do |adjective|
puts "Working with a Procs is #{adjective} pleasure!"
end
proc.call("great")
proc.("big") # = proc.call("big")
proc["enormous"]
proc === "all"
Lambda
return
w
Proc
u będzie wykonany w kontekscie definicji
Proc
a:
#!/usr/bin/env ruby -wKU
def run_a_proc(p)
puts "Starting to run a proc."
p.call
puts "Finished running the proc.\n\n"
end
run_a_proc lambda { puts "I'm a lambda!"; return }
# Proc jest definiowany tutaj, czyli w głównym kontekscie
# a z głównego kontekstu nie można nic zwrócić
run_a_proc proc { puts "I'm just a proc. :-("; return }
# Output
/Users/sqbell/Workspace/ruby/others/procs.rb:10:in `block in <main>': unexpected return (LocalJumpError)
from /Users/sqbell/Workspace/ruby/others/procs.rb:5:in `call'
from /Users/sqbell/Workspace/ruby/others/procs.rb:5:in `run_a_proc'
from /Users/sqbell/Workspace/ruby/others/procs.rb:10:in `<main>'
Starting to run a proc.
I'm a lambda!
Finished running the proc.
Starting to run a proc.
I'm just a proc. :-(
Closure
Closure posiada referencje do zmiennych z kontekstu, w którym została zdefiniowana,
#!/usr/bin/env ruby -wKU
def run_proc(p)
p.call
end
name = "Marek"
print_a_name = proc { puts name }
name = "Krzysztof"
run_proc print_a_name
# Output
Krzysztof
inf/ruby/procs.txt · Last modified: 2021/02/16 09:56 (external edit)