我试图让数组的最后一个字符加入它自己的角色。我无法自己解决这个问题,我仍然不熟悉ruby的内置方法。到目前为止我在这里:
def list(names)
#last = names.last
joined = names.map(&:values).flatten.join(", ")
#joined.pop
#joined << last.join(" &")
end
我想要做的是最后一个索引我想加入它自己的角色。我已经尝试了几个小时,但我一直在收到错误。如果有人能指出我正确的方向,我会非常感激。
我的输出目标是
list([{name: 'Bart'},{name: 'Lisa'},{name: 'Garry'}])
输出:
"Bart, Lisa & Gary"
答案 0 :(得分:1)
这是一个解决方案,根据您的输入产生您想要的输出:
def list(names)
*head, tail = names.map(&:values)
[head.join(", "), tail].join(" & ")
end
享受!
答案 1 :(得分:1)
我建议创建一个字符串,其中所有名称用逗号分隔(例如“Bart,Lisa,Garry”),然后用“&amp;”替换最后一个逗号。这有两种方法可以做到。
<强>代码强>
def list1(names)
all_commas(names).tap { |s| s[s.rindex(',')] = ' &' }
end
def list2(names)
all_commas(names).sub(/,(?=[^,]+\z)/, ' &')
end
def all_commas(names)
names.map(&:values).join(', ')
end
示例强>
names = [{ name: 'Bart' }, { name: 'Lisa' } , { name: 'Garry' }]
list1 names
#=> "Bart, Lisa & Garry"
list2 names
#=> "Bart, Lisa & Garry"
<强>解释强>
步骤如下。
all_commas
:
a = names.map(&:values)
#=> [["Bart"], ["Lisa"], ["Garry"]]
a.join(', ')
#=> "Bart, Lisa, Garry"
适用于list1
s = all_commas(names)
#=> "Bart, Lisa, Garry"
i = s.rindex(',')
#=> 10
s[i] = ' &'
#=> " &"
s #=> "Bart, Lisa & Garry"
tap
的阻止返回s
适用于list2
a = all_commas(names)
#=> "Bart, Lisa, Garry"
a.sub(/,(?=[^,]+\z)/, ' &')
# => "Bart, Lisa & Garry"
正则表达式采用正向前瞻,读取“匹配逗号,后跟逗号以外的一个或多个字符,后跟字符串的结尾”。
答案 2 :(得分:0)
以下是牛津逗号的解决方案,我更喜欢:)
def list(name_list)
*names, last = name_list.flat_map(&:values)
oxford_comma = names.size > 1 ? ", " : ""
names.join(", ") + oxford_comma + "& #{last}"
end
(注意:如果这是Rails,Array#to_sentence
会自动执行此操作。)