2013-04-13 38 views
0

我只能找到查找數組的特定元素的方法。在ruby中是否存在與Java的Iterator.hasNext()類似的Array操作?

在我的objects.each | a |循環,我想知道,當我在最後一個元素,所以我可以有這樣一個循環:

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

迭代器的hasNext()確定數組的迭代器有目前正在評估在一個又一個元素。

我想強調一下,我打算輸出這些值,而不是將它們轉換爲數組。 .join不是我在這裏尋找的。

+4

如果你問一個紅寶石男人的問題,你應該描述什麼「hasNext()」。作爲一個rubist我可能會幫助,但... – drhenner

+0

在什麼情況下你需要它? –

+0

@fmendez,我正在使用.each | a |運行循環。我想每次都打印逗號,除非是最後一個。我想要這個列表(漂亮,醜陋,愚蠢)不是(漂亮,醜陋,愚蠢)。任何想法 –

回答

1

這是常見的倚一種新的語言的時候,人們往往會尋找那熟悉:)

你的具體問題,事情就可以很容易地通過全光照來解決g 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 
4

是否有可比性陣列操作Java的hasNext()在紅寶石?所有的Java數組的

首先沒有任何hasNext方法本身,因爲這沒有任何意義。有它的是iterator。在Ruby中有沒有這樣的事,作爲一個列表和強大的迭代方法(eacheach_*家族)將使它很沒用:

my_array.each do |current| 

    // operations 

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

因此,無論有沒有這樣的事情。

我正在使用.each | a |運行循環。我想每次都打印逗號,除非是最後一個。我想要這個列表(漂亮,醜陋,愚蠢)不是(漂亮,醜陋,愚蠢)。任何想法

你應該看看.join方法。

8

不,沒有。但是請注意,hasNext也不是在Java中的Array操作。這是一個Iterator操作,而Ruby的等效Java的IteratorEnumerator,而不是Array

但是,Ruby的Enumerator的工作方式與Java的有所不同:不是詢問是否存在下一個元素,然後推進迭代器,只需嘗試查看下一個元素,並在拋出異常時拋出異常沒有更多的元素。

所以,相當於Java的

iter.hasNext); 

將大致

begin 
    enum.peek 
    true 
rescue StopIteration 
    false 
end 

但是,你幾乎從來沒有迭代手動紅寶石。相反,您可以使用更高級別的迭代方法,如joinflat_mapgroup_byuniqsortsort_byinjectmapeach_with_objecteach等。

例如:

%w(pretty ugly stupid).join(', ') # => 'pretty, ugly, stupid' 
+0

+1非常詳細的解釋! – fmendez

1

我想強調的是,我在尋找打印出這些值,而不是 把他們中的數組。 .join不是我在這裏尋找的。

其實,我想.join正是你要找的。 。加入的結果是一個字符串,而不是一個數組,這樣

puts objects.join(",") 

做你說你想要的。

2

在Ruby庫迭代器被實現爲在對比的Java它實現外部迭代內部迭代器。兩者之間的主要區別在於前者旨在不讓客戶控制迭代,而後者則留給客戶這個責任。

hasNext的方法的目的是要直接控制的迭代,從而在紅寶石沒有這樣的事情存在。像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) 
相關問題