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



在Ruby中,你可以这样做:

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

特别是,我对能够获取上面示例中xy的参数的名称感兴趣。

在水晶中,我有以下情况:

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

在水晶中如何做到这一点?

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

macro foo(&block)
  {{ block.args.first.stringify }}
end
p foo {|x| 0 } # => "x"

为了扩展 Jonne Haß 的伟大答案,Ruby parameters 方法的等价物是这样的:

macro block_args(&block)
  {{ block.args.map &.symbolize }}
end
p block_args {|x, y, *other| } # => [:x, :y, :other]

请注意,块参数在 Crystal 中始终是必需的,并且不能有默认值。

相关内容

  • 没有找到相关文章

最新更新