Programing

루비에서 .each 루프의 끝을 알려줍니다.

lottogame 2020. 10. 9. 08:45
반응형

루비에서 .each 루프의 끝을 알려줍니다.


다음과 같은 루프가있는 경우

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

@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

일부 루비 버전에 대한 해시에 대한 마지막 방법은 없습니다.

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

참고 URL : https://stackoverflow.com/questions/4000713/tell-the-end-of-a-each-loop-in-ruby

반응형