【问题标题】:How to determine if a record is the first/last one in an iteration?如何确定记录是否是迭代中的第一个/最后一个?
【发布时间】:2021-05-07 22:05:37
【问题描述】:

这件事让我思考了好几次。在这个例子中,我有一个数组,这个数组有 10 个值,应该用逗号分隔,但在最后一个值之后不应该有逗号,所以我使用了一个计数器:

data = ["john", "james", "henry", "david", "daniel", "jennifer", "ruth", "penny", "robin", "julia"]
counter = 0 
count = data.size
sentence = String.new
data.each do |name|
     if counter == (count-1)
          sentence += name
     else
          sentence += "#{name}, "
     end
     counter += 1
end

但这太脏了没有任何方法可以找出当前对象(在本例中为“名称”)是迭代中的第一个还是最后一个?

【问题讨论】:

  • data.join(', ') 如果我理解正确的话

标签: ruby


【解决方案1】:

在这种特定情况下,data.join(', ') 可以,更普遍的是data.each {|d| #do stuff unless d.equal? data.last}

【讨论】:

  • 如果列表中有另一个“Julia”,== 将失败。 d.equal?(data.last) 测试对象是否相等。
  • 当然 - 总是忘记不是唯一的情况 - 谢谢 - 我已经更正了答案,所以没有人在没有阅读 cmets 的情况下复制
【解决方案2】:

你应该写data.join(', ')。无论如何,回答你的问题:

有没有办法判断当前对象是迭代中的第一个还是最后一个?

xs = [1, 2, 3, 4]
xs.each.with_index do |x, index|
  if index == 0
    puts("First element: #{x}")
  elsif index == xs.size - 1
    puts("Last element: #{x}")
  else
    puts("Somewhere in the middle: #{x}")
  end
end

【讨论】:

    【解决方案3】:

    如果您的数组包含唯一元素,您可以使用 name==data.last

    否则直接使用

    data.join(', ')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2018-09-01
      • 2012-11-09
      • 2022-10-18
      • 2016-02-12
      相关资源
      最近更新 更多