如果我有一个环,例如

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top