我目前正在学习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示例?
答案 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 }