如何在Ruby的map调用中以无点式传递实例方法?
Ruby 无点式调用实例方法的正确实现
最简写法:符号转Proc语法糖
针对你提出的「对列表L中每个C类实例调用实例方法M」的需求,Ruby提供了最简洁的无点式写法:
L.map(&:M)
这行代码完全等价于L.map { |element| element.M },是Ruby社区公认的处理此类场景的标准无点式风格,简洁且易读。
关于你尝试的&method(...)写法的问题
你提到的["foo", "bar"].map(&method(:String.capitalize))存在逻辑错误:
method(:String.capitalize)试图获取String类的capitalize类方法,但capitalize是实例方法,并非类方法,执行时会直接抛出NameError。- 如果非要通过
instance_method的方式实现,写法会冗余很多:
这种写法既不简洁也不符合Ruby的惯用风格,实际开发中几乎不会使用。["foo", "bar"].map(&String.instance_method(:capitalize).to_proc)
总结
当需要对集合内每个实例调用其自身的实例方法时,直接使用&:方法名的形式是最优解,完美满足无点式编程的需求。
内容的提问来源于stack exchange,提问作者geckos
相关产品推荐
相关产品推荐

