You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取传入代码块的参数名称?Ruby示例及Crystal实现方法咨询

嘿,这个问题我刚好研究过!在Crystal里要获取方法参数的名称(比如你提到的x、y这类),其实可以用它的反射(Reflection)API或者宏系统来实现,和Ruby的思路类似但具体用法有区别,我给你举几个实际的例子:

1. 运行时获取参数名称(普通方法/实例方法)

假设你有这样一个简单的方法:

def add(x : Int32, y : Int32)
  x + y
end

要拿到它的参数名,你可以通过Method对象的params方法来获取,每个参数实例都有name属性:

# 获取目标方法的对象
method = self.method(:add)
# 提取所有参数的名称
param_names = method.params.map(&.name)

puts param_names # 会输出 ["x", "y"]

如果是类的实例方法,用法也差不多:

class Calculator
  def multiply(a : Float64, b : Float64)
    a * b
  end
end

calc_instance = Calculator.new
method = calc_instance.method(:multiply)
param_names = method.params.map(&.name)

puts param_names # 输出 ["a", "b"]

哪怕是带默认值的参数、关键字参数,也能正确提取名称:

def greet(name : String, greeting : String = "Hello", age : Int32? = nil)
  "#{greeting}, #{name}#{age ? " (age #{age})" : ""}!"
end

method = self.method(:greet)
puts method.params.map(&.name) # 输出 ["name", "greeting", "age"]

2. 编译时获取参数名称(宏场景)

如果你的需求是在编译阶段就拿到参数名(比如用来生成代码),那可以用Crystal的宏系统来实现:

# 定义一个宏,用来返回当前方法的参数名称列表
macro param_names
  {{ @def.params.map(&.name).join(", ") }}
end

def test(x, y, z)
  puts "参数名称:#{param_names}"
end

test(1, 2, 3) # 运行后会输出 "参数名称:x, y, z"

宏里的@def代表当前被宏调用的方法定义,通过它可以直接拿到编译时的参数信息,这种方式性能更好,适合需要动态生成代码的场景。

总的来说,Crystal的反射和宏系统都能满足你获取参数名称的需求,具体选哪种取决于你是在运行时还是编译时处理~

内容的提问来源于stack exchange,提问作者Martimatix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:04:22