【问题标题】:How to create Procs with variable arguments in Crystal?如何在 Crystal 中创建具有可变参数的 Procs?
【发布时间】:2015-10-08 07:35:14
【问题描述】:

我想像使用 splat 一样将参数传递给 Proc,但它返回错误 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

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    您需要在任何地方指定参数列表。

    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"
    

    【讨论】:

    • 不完全,不。 Crystal 需要知道参数列表,并且在同一个集合中支持许多不同的参数列表很快就会变得相当难管理。正如我所展示的,可以省略不需要的块参数。
    • 我明白了......然后我尝试用 Hash 来做这个,我想我还不明白它是如何工作的 carc.in/#/r/7hk
    • 如果你的哈希不干扰正确的类型,你需要更明确一点carc.in/#/r/7hm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2012-11-23
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多