2015-07-18 3 views
6

Ich möchte Argumente in ein Proc wie splat mit zu übergeben, aber es gibt einen Fehler wrong number of block arguments (1 for 0)Wie erstellt Procs mit variablen Argumenten in Crystal?

$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

Antwort

7

Sie müssen überall die Argumentliste angeben.

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" 
+0

Also kann ich nicht tun, wie ich in Ruby tun? http://carc.in/#/r/7h6 –

+0

Nicht vollständig, nein. Crystal muss die Argumentliste kennen und die Unterstützung vieler anderer in der gleichen Sammlung wird ziemlich hässlich sein, um sie recht bald zu verwalten. Wie ich gezeigt habe, ist es jedoch möglich, Blockargumente wegzulassen, die Sie nicht benötigen. –

+0

Ich verstehe ... und dann habe ich versucht, dies mit Hash zu machen und ich denke, ich verstehe nicht, wie es funktioniert noch http://carc.in/#/r/7hk –

Verwandte Themen