0

我只能找到查找数组特定元素的方法。

在我的对象中。每个 |a| 循环,我想知道我什么时候在最后一个元素,所以我可以有一个像这样的循环:

objects.each |a|
   if objects.hasNext()
       puts a.name + ","
   else
       puts a.name

Iterator 的 hasNext() 确定 Array 的迭代器在当前正在评估的元素之后是否还有另一个元素。

我想强调的是,我希望打印出这些值,而不是将它们转换为数组。.join 不是我在这里寻找的。

4

5 回答 5

11

不,没有。但是,请注意,这hasNext也不是ArrayJava 中的操作。这是一个Iterator操作,Ruby 相当于 Java 的Iteratoris Enumerator, not Array.

但是,Ruby 的Enumerator工作方式与 Java 有点不同:不是询问是否有下一个元素,然后推进迭代器,而是简单地尝试查看下一个元素,StopIteration当没有更多元素时它会抛出异常。

所以,相当于Java的

iter.hasNext);

大概是

begin
  enum.peek
  true
rescue StopIteration
  false
end

但是,您几乎从不在 Ruby 中手动迭代。相反,您使用更高级别的迭代方法,例如join, flat_map, group_by, uniq, sort, sort_by, inject, map, each_with_object,each等。

例如:

%w(pretty ugly stupid).join(', ') # => 'pretty, ugly, stupid'
于 2013-04-13T14:23:23.997 回答
4

Ruby 中是否有与 Java 的 hasNext() 类似的 Array 操作?

首先,Java 的 Array 本身没有任何hasNext方法,因为它没有任何意义。它是拥有它的迭代器。在 Ruby 中,没有列表这样的东西,强大的迭代器方法(each及其each_*家族)会让它变得毫无用处:

my_array.each do |current|

    // operations

    // implicit:
    // if (current.has_next) current = current.next
    // else break
end

所以,不,没有这样的事情。

我正在使用 .each |a| 运行循环。我想每次都打印一个逗号,除非它是最后一个。我想要这个列表(漂亮、丑陋、愚蠢)而不是(漂亮、丑陋、愚蠢)。有什么想法吗

你应该看看.join方法。

于 2013-04-13T14:19:05.363 回答
2

在 Ruby 库中,迭代器被实现为内部迭代器,而 Java 实现了外部迭代器。两者的关键区别在于前者的设计目的是不让客户端控制迭代,而后者则将这个责任留给客户端。

like 方法的目的hasNext是直接控制迭代,因此在 Ruby 中不存在这样的东西。我猜想,类似peeknext定义的方法Enumerator不是为了直接控制迭代,而是为了实现自定义的内部迭代器。

也就是说,您的问题很容易通过以下代码解决:

puts objects.map(&:name).join(', ')

Enumerator然而,有时使用一个对象来构建你自己的内部迭代器可能很有用:

module Enumerable
  def puts_each_with_separator(separator)
    enum = each
    loop do
      print yield(enum.next)
      enum.peek rescue break
      print separator
    end
    puts
  end
end

objects.puts_each_with_separator(', ', &:name)
于 2013-04-14T00:12:51.787 回答
2

通常,当学习一门新语言时,人们倾向于寻找熟悉的东西:)

您的具体问题可以通过使用轻松解决each_with_index

objects.each_with_index do |object ,index|
    if index == (object.length -1) then 
        puts a.name + ","
    else
        puts a.name
    end
end
于 2013-04-14T05:14:46.430 回答
1

我想强调的是,我希望打印出这些值,而不是将它们转换为数组。.join 不是我在这里寻找的。

实际上,我认为 .join 正是您正在寻找的。.join 的结果是一个字符串,而不是一个数组,所以

puts objects.join(",") 

做你说你想要的。

于 2013-04-13T18:43:29.380 回答