如何将数组中的每个元素都转换为大写?

30

如何将元素数组转换为大写?期望输出为:

["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]  
=> ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]

以下方法无效,导致它们均为小写。

Day.weekday.map(&:name).each {|the_day| the_day.upcase }
 => ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] 
3个回答

68

返回一个新数组

如果你想要返回一个所有元素都为大写的数组,可以使用#map方法:

array = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]

# Return the uppercased version.
array.map(&:upcase)
=> ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]

# Return the original, unmodified array.
array
=> ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]

正如您所看到的,原始数组没有被修改,但是您可以使用从 #map 返回的大写值在任何可以使用表达式的地方。

就地更新数组

如果您想就地将数组转换为大写,请改用 #map!

array = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
array.map!(&:upcase)
array
=> ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]

如果数组中的元素为nil,则使用array.map!(&:upcase)会在其上产生无方法错误。我该如何解决这个问题?谢谢 - DanRio
@DanRio 首先使用.compact去除所有的nil,然后执行upcase.. array.compact!.map!(&:upcase) - Arup Rakshit

7
这应该能够正常工作:
Day.weekday.map(&:name).map(&:upcase)

或者,如果您想节省一些CPU周期

Day.weekday.map{|wd| wd.name.upcase}

4
在您的示例中,将'each'替换为'map'。
虽然'each'遍历数组,但它不会创建包含块返回值的新数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接