告诉红宝石。每一个循环结束
-
25-09-2019 - |
题
如果我有一个环,例如
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_with_index do |u, index|
# some code
if index == users.size - 1
# code for the last user
end
end
其他提示
如果这是一个非此即彼/或情况,在那里你将一些代码,所有的但的最后一个用户,然后一些独特的代码的只有的最后一个用户,一个其他解决方案可能更合适。
不过,你似乎正在运行的所有用户相同的代码,并在过去的一些用户的其他的代码。如果是这样的情况下,这似乎更正确,更明确指出你的意图:
users.each do |u|
#code for everyone
end
users.last.do_stuff() # code for last user
我认为最好的做法是:
users.each do |u|
#code for everyone
if u.equal?(users.last)
#code for the last user
end
end
你试过each_with_index
?
users.each_with_index do |u, i|
if users.size-1 == i
#code for last items
end
end
h = { :a => :aa, :b => :bb }
h.each_with_index do |(k,v), i|
puts ' Put last element logic here' if i == h.size - 1
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
您可以使用@微薄的做法也是一个非此即彼/或情况,在那里你将一些代码,除了最后一个用户,然后一些独特的代码,只有最后一个用户。
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
有用于红宝石
的一些版本中为散列没有最后的方法h = { :a => :aa, :b => :bb }
last_key = h.keys.last
h.each do |k,v|
puts "Put last key #{k} and last value #{v}" if last_key == k
end
不隶属于 StackOverflow