如果我有一个循环
users.each do |u|
#some code
end
用户是多个用户的哈希。查看您是否位于用户哈希中的最后一个用户并且只想为该最后一个用户执行特定代码的最简单的条件逻辑是什么
users.each do |u|
#code for everyone
#conditional code for last user
#code for the last user
end
end
如果我有一个循环
users.each do |u|
#some code
end
用户是多个用户的哈希。查看您是否位于用户哈希中的最后一个用户并且只想为该最后一个用户执行特定代码的最简单的条件逻辑是什么
users.each do |u|
#code for everyone
#conditional code for last user
#code for the last user
end
end
Hash
在Enumerable中混合,因此它确实具有each_with_index
。即使没有对哈希键进行排序,在呈现视图时也始终会出现这种逻辑,无论在某种意义上的数据意义上,最后一项是否实际上是“最后”,其最后一项都可能以不同的方式显示。
each_with_index
道歉。是的,我可以看到它会出现;只是试图澄清这个问题。就我个人而言,最好的答案是使用,.last
但不适用于仅适用于数组的哈希。
Answers:
users.each_with_index do |u, index|
# some code
if index == users.size - 1
# code for the last user
end
end
.last
在循环外使用。
users.each_with_index do |(key, value), index| #your code end
如果这是一个非此即彼/或情况,在那里你将一些代码给所有,但最后一个用户,然后一些独特的代码,只有最后一个用户的另一种解决方案可能更为合适。
但是,您似乎正在为所有用户运行相同的代码,并为最后一个用户运行一些其他代码。如果是这样,这似乎更正确,并且更清楚地说明了您的意图:
users.each do |u|
#code for everyone
end
users.last.do_stuff() # code for last user
.last
与循环无关的调用。
.last
。该集合已被实例化,这只是对数组的简单访问。即使该集合尚未加载(例如,它仍然是未水化的ActiveRecord关系),last
也永远不会循环以获取最后一个值,这将导致效率低下。它只是修改SQL查询以返回最后一条记录。就是说,此集合已经由加载.each
,因此所涉及的复杂性没有您需要的复杂x = [1,2,3]; x.last
。
我认为最好的方法是:
users.each do |u|
#code for everyone
if u.equal?(users.last)
#code for the last user
end
end
u.equal?(users.last)
,该equal?
方法比较object_id而不是对象的值。但这不适用于符号和数字。
你试过了each_with_index
吗?
users.each_with_index do |u, i|
if users.size-1 == i
#code for last items
end
end
有时,我发现将逻辑分为两部分更好,一个用于所有用户,一个用于最后一个。所以我会做这样的事情:
users[0...-1].each do |user|
method_for_all_users user
end
method_for_all_users users.last
method_for_last_user users.last
您也可以将@meager的方法用于以下两种情况之一:将最后一个用户以外的所有代码都应用到其他用户,然后仅对最后一个用户应用唯一的代码。
users[0..-2].each do |u|
#code for everyone except the last one, if the array size is 1 it gets never executed
end
users.last.do_stuff() # code for last user
这样,您不需要条件!
另一个解决方案是从StopIteration中解救:
user_list = users.each
begin
while true do
user = user_list.next
user.do_something
end
rescue StopIteration
user.do_something
end
StopIteration
是出于处理循环退出的确切原因而设计的。根据Matz的书中的说法:“这似乎很不正常-为预期的终止条件引发了异常,而不是意外的异常事件。(StopIteration
是StandardError
and的后代IndexError
;请注意,它是唯一不包含单词的异常类之一Ruby在这种外部迭代技术中遵循Python(更多...)
next
为特殊的迭代结束值,也无需在调用next?
之前调用某种谓词next
。”
loop do
有一个隐含rescue
的StopIteration
;它在外部迭代Enumerator
对象时专门使用。loop do; my_enum.next; end
将迭代my_enum
并最终退出;无需在其中放置一个rescue StopIteration
。(如果必须使用while
或,则必须这样做until
。)
each_with_index
或last
方法。