如何使用Ruby中的数组方法使用牛津逗号将字符串数组转换为列表

时间:2019-06-09 20:15:33

标签: arrays ruby string

这是一个家庭作业问题,因此在来这里寻求帮助之前,我尽了最大的努力。我已经解决了95%的问题,只是无法弄清最后一点的语法,或者如果它与我现在正在使用的方法不同,我应该使用哪种方法。我在网上找不到任何实际上不是同学答案的解决方案,因此我避免单击那些来查看他们是如何完成问题的。

如果字符串只有一个元素,则返回不带格式的字符串;如果有两个元素,则仅带有单词“ and”;如果元素有三个以上,则可以添加逗号和单词“ and”。但是,当数组具有三个以上的元素时,我似乎无法跳过添加最后一个逗号的问题。

def oxford_comma(array)
    if array.length == 2
        array.join(" and ")
    elsif array.length > 2
        array.insert(-2, "and")
        array[0..-1].join(", ")
    else
        array.join
    end
end

这是我收到的错误消息:

         Failure/Error: expect(oxford_comma(["kiwi", "durian", "starfruit", "mangos", "dragon fruits"])).to eq("kiwi, durian, starfruit, mangos, and dragon fruits")

   expected: "kiwi, durian, starfruit, mangos, and dragon fruits"
        got: "kiwi, durian, starfruit, mangos, and, dragon fruits"

   (compared using ==)

3 个答案:

答案 0 :(得分:1)

当数组中只有一个元素时,Array#join返回元素本身:

['a'].join(' and ') #=> "a"

因此,当列表大小为3或更大时,您可以将代码"and "简化为最后一个元素;如果少于3个元素,则返回.join(' and ')

def oxford_comma(list)
  return list.join(' and ') if list.size < 3
  list[-1] = "and " + list[-1]
  list.join(', ')
end

答案 1 :(得分:0)

编辑带有最多评论:

您可以这样做:

def oxford_comma(array)
  array = [*array]
  case array.size
  when 0
    ''
  when 1
    array[0].to_s
  when 2
    array.join(' and ')
  else
    array_copy = array
    array_copy[-1] = "and #{array_copy[-1]}"
    array_copy.join(', ')
  end
end

用于处理空数组,单值数组和双值数组的边缘情况的情况。 否则,您更改最后一项以添加and,然后用逗号将所有内容连接起来。 使用该数组的副本是非破坏性的。

enter image description here

答案 2 :(得分:0)

出于可读性考虑,我建议一个简单的解决方案。

oxford_comma ["blue", "green", "pink", "white"]
  #=> "blue, green, pink and white" 
oxford_comma ["blue", "green"]
  #=> "blue and green" 
oxford_comma ["blue"]
  #=> "blue" 
oxford_comma []
  #=> "" 

class CommentsController < GraphqlRails::Controller
  action(:create).permit(:article_id, :body).returns(!Types::CommentType)
  action(:update).permit(:id, :body).returns(!Types::CommentType)

  def create
    Comment.create!(params)
  end

  def update
    Comment.find(params[:id]).update!(params)
  end
end