How to create Procs with variable arguments in Crystal?

I want to pass Proc arguments using splat , but it returns the error wrong number of block arguments (1 for 0)

 $callbacks = {} of String => Array(->) def add_callback(event, &block) begin $callbacks[event.to_s] << block rescue $callbacks[event.to_s] = [block] end end add_callback(:event) do |arg| puts "event!" end $callbacks["event"].first.call 

Error in line 11: wrong number of block arguments (1 for 0) http://carc.in/#/r/7gw

+6
source share
1 answer

You need to always specify a list of arguments.

 class EventManager def initialize @callbacks = Hash(String, Array(String ->)).new {|h, k| h[k] = [] of String -> } end def add(event, &callback : String ->) @callbacks[event] << callback end def fire(event, argument : String) @callbacks[event].each &.call(argument) end end callbacks = EventManager.new callbacks.add("foo") do |argument| puts "Got #{argument}" end callbacks.add("bar") do puts "I was called" end callbacks.fire "foo", "Ping" callbacks.fire "bar", "Pong" 
+7
source

All Articles