Ruby中Python的next()是什么?

时间:2019-02-20 22:18:43

标签: ruby

我目前正在学习Ruby,但是迷路了。

此Python代码段:

  $lookupField.autocomplete( scriptPath, {
    matchContains: true,
    minChars: 0,
    delay: 300,
    scrollHeight: 300,
    max: 1000,
    width: 650,
    matchSubset: false,

    formatItem: formatSchoolResult,
    formatResult: function(data, value) { return data[0]; },
    select: function(event, ui) { console.log('Item was selected', event, ui ) }
  });

  $lookupField.result( 

     function(event, data, formatted) { 

       /** CODE THAT NEEDS ATTENTION **/
       /** I want the searchQuery to be "FooSchool" **/
       /** but it is already "My school is not listed" **/
       var searchQuery = $lookupField.val();

       /** then here I prompt to get the full name of the school **/
       myCustomPrompt( searchQuery );

     }

  );

给予:

n = iter([1,2,3,4,5])
for x in n:
  print(x)
  y = next(n)
  print(y)

我正在尝试在Ruby中做同样的事情,但这是行不通的:

1
2
3
4
5

我该如何用Ruby编写Python示例?

5 个答案:

答案 0 :(得分:1)

您有一个正确的想法,除了Ruby在内部跟踪枚举器的位置。试试这个:

enum = [1,2,3,4,5].each
  #=> #<Enumerator: [1, 2, 3, 4, 5]:each>    
loop do
  puts enum.next
  puts enum.next
end
1
2
3
4
5
在生成枚举器enum的所有元素之后调用

Enumerator#next时会引发 StopInteration 异常。 Kernel#loop通过打破循环来处理异常。

请注意,Array#each(不带可选块)的作用与Object#to_enum相同。此外,尽管Ruby书的作者感到有义务涵盖for循环(看似在第一页上),但实际上它们从未使用过。

答案 1 :(得分:1)

在Python中,使用功能iterator获得的iter() n 只能使用一次

array = [1,2,3,4,5]
n = iter(array)

for x in n:
  print(x)

# 1
# 2
# 3
# 4
# 5

如果您随后致电next(n),则不会得到任何输出,但会出现错误:StopIteration。如果尝试再次迭代n,则不会获得任何输出(没有错误,for循环将处理该异常)。

但是您可以遍历数组:

for x in array:
  print(x)

如果您检查输出类似您的代码,则会得到:

n = iter([1,2,3,4,5])
for x in n:
  print('odd_', x)
  y = next(n)
  print('even', y)

# odd_ 1
# even 2
# odd_ 3
# even 4
# odd_ 5

# StopIteration

@toniedzwiedz Object#to_enum指出,它与Python iter()等效,因此您可以在其上调用Enumerator#next

Ruby中,您可以消耗一次以上枚举器:

array = [1, 2, 3, 4, 5]
n = array.to_enum
# n = array.each # each returns an Enumerable

for x in n do
    puts x
end

for x in n do
    puts x
end

由于您可以消耗一次以上的枚举数,因此您会获得“双倍”输出:

for x in n do
    p x
    p n.next
end

或使用Array#each

n.each do |x| # same as array.each.each
  p x
  p n.next
end

在Ruby中,您还可以结束迭代信号:

6.times do
  p n.next
end
# `next': iteration reached an end (StopIteration)

答案 2 :(得分:0)

您只是要打印数组的每个元素?

[1,2,3,4,5].each {|n| puts n}

答案 3 :(得分:0)

如果您要查找与Python's iterator直接对应的内容,则应查看Enumerator#next以获取非常相似的API

arr = [1, 2, 3].to_enum
#<Enumerator: [1, 2, 3]:each>
arr.next
# 1

for x in arr do
    puts x
    puts arr.next
end

#1
#2
#2
#3
#3
#StopIteration: iteration reached an end

答案 4 :(得分:0)

each_cons是您所需要的。但是此方法的缺点是current将不会打印数组的最后一个元素。请记住这一点。

[1,2,3,4,5].each_cons(2) { |current,next_val| puts next_val }