ruby - 为多个字段做&符号在红宝石中不起作用
问题描述
在红宝石中,我可以做到
['Hi', 'Yo'].map(&:upcase)
但是,如果我想同时获得两者:upcase
怎么:downcase
办?
两者都不
['Hi', 'Yo'].map(&[:upcase,:downcase])
也不
['Hi', 'Yo'].map([&:upcase,&:downcase])
工作。:(
解决方案
你在这里有什么:
['Hi', 'Yo'].map(&:upcase)
实际上是一个简短的版本:
['Hi', 'Yo'].map(&:upcase.to_proc)
这是一个变体:
['Hi', 'Yo'].map(&->(s) { s.send(:upcase) })
或者换句话说:
['Hi', 'Yo'].map { |s| s.upcase }
该&:x
符号实际上是此类情况的一种特殊情况的简写,并且仅适用于单数符号。你可以做的是to_proc
大致像这样定义一个方法:
class Array
def to_proc
->(i) { inject(i) { |v, m| v.send(m) } }
end
end
该方法必须返回一个Proc
对象,即“lambda”,它在此处使用 Ruby-> (...) { ... }
表示法定义。
然后你可以这样称呼它:
['Hi', 'Yo'].map(&[:upcase, :downcase, :to_sym].to_proc)
# => [:hi, :yo]
推荐阅读
- c - 为什么我的 execve() 仅在参数包含 /bin/ 时才有效?
- mysql - MySQLTrigger 执行中的未知列
- r - UseMethod(“group_by_”)中的错误:没有适用于“group_by_”的方法应用于“字符”类的对象
- linux - 我对 Linux 中的 DNSperf 工具中的选项有疑问
- angular - 使用 Angular 和 Jasmine/Karma 的私有方法进行测试和代码覆盖
- java - 根据java中的内部对象列表值从对象列表中删除一个元素
- c++ - 暴露最直接的基类模板名称
- flutter - 如何像这样制作自己的可滚动列?
- reactjs - 通过电容器在 Ionic 中接收发送意图
- python - 使用python生成shell脚本