如何获取传递到块中的参数名称?

马蒂玛蒂克斯

在Ruby中,您可以执行以下操作:

prc = lambda{|x, y=42, *other|}
prc.parameters  #=> [[:req, :x], [:opt, :y], [:rest, :other]]

特别是,我对能够获取上述示例x的参数名称感兴趣y

在Crystal中,我有以下情况:

def my_method(&block)
  # I would like the name of the arguments of the block here
end

在Crystal中如何做到这一点?

琼恩(Jonne)仇恨

尽管这在Ruby中听起来很奇怪,但是在Crystal中却无法做到这一点,因为在您的示例中,该块已经没有参数了。另一个问题是这些信息在编译后已经丢失。因此,我们需要在编译时访问它。但是您不能在编译时访问运行时方法参数。但是,您可以使用宏访问该块,然后甚至可以在不显式赋予它们的情况下允许该块的任意签名:

macro foo(&block)
  {{ block.args.first.stringify }}
end

p foo {|x| 0 } # => "x"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章