Ruby中使用&符号处理多方法失效,如何同时调用upcase和downcase?
解决Ruby中同时获取字符串大小写转换结果的问题
这个问题很常见,你已经知道用map(&:upcase)可以快速把数组里的字符串转成大写,但想同时拿到每个元素的大小写结果时,直接传符号数组给&确实行不通——因为&操作符只能把单个可调用对象(比如符号、Proc)转换成块,而数组并没有to_proc方法,所以你试的两种写法都会报错。
下面给你几种实用的解决方案:
直接在
map块中处理
这是最直观的方式,对每个字符串分别调用upcase和downcase,并把结果放在数组里返回:['Hi', 'Yo'].map { |str| [str.upcase, str.downcase] } # 输出结果:[["HI", "hi"], ["YO", "yo"]]每个原数组元素对应一个包含大小写结果的子数组,结构清晰。
复用方法集合(适合多场景)
如果以后需要添加更多字符串处理方法,可以先把方法名存在数组里,再通过send动态调用:string_methods = [:upcase, :downcase] ['Hi', 'Yo'].map { |str| string_methods.map { |meth| str.send(meth) } } # 同样得到:[["HI", "hi"], ["YO", "yo"]]这种方式扩展性强,后续只要修改
string_methods数组就能新增处理逻辑。扁平化结果(如果需要一维数组)
要是你希望所有转换结果都放在一个一维数组里,可以用flat_map代替map:['Hi', 'Yo'].flat_map { |str| [str.upcase, str.downcase] } # 输出结果:["HI", "hi", "YO", "yo"]
再补充下你之前写法的问题:
['Hi', 'Yo'].map(&[:upcase,:downcase]):&会尝试调用对象的to_proc方法,但数组没有这个方法,所以会抛出TypeError;['Hi', 'Yo'].map([&:upcase,&:downcase]):这是语法错误,&只能用于块参数的位置,不能直接放在数组字面量里。
内容的提问来源于stack exchange,提问作者Qiang Li
相关产品推荐
相关产品推荐

