2011-10-22 27 views
12

Một điều khiến tôi suy nghĩ nhiều lần. Trong ví dụ này, tôi có một mảng và mảng này có 10 giá trị cần được tách bởi commatas nhưng sau khi người cuối cùng có should not là một commata vì vậy tôi sử dụng một bộ đếm:Làm thế nào để xác định xem một bản ghi là bản ghi đầu tiên/cuối cùng trong một lần lặp?

data = ["john", "james", "henry", "david", "daniel", "jennifer", "ruth", "penny", "robin", "julia"] 
counter = 0 
count = data.size 
sentence = String.new 
data.each do |name| 
    if counter == (count-1) 
      sentence += name 
    else 
      sentence += "#{name}, " 
    end 
    counter += 1 
end 

Nhưng đây là isnt quá bẩn có bất kỳ phương pháp để tìm ra nếu đối tượng hiện tại (trong trường hợp này "tên") là frist hoặc cuối cùng trong iteration?

+1

'data.join ('') 'nếu tôi hiểu bạn một cách chính xác – user973254

Trả lời

25

trong trường hợp cụ thể này, data.join(', ') sẽ làm gì, nói chung data.each {|d| #do stuff unless d.equal? data.last}

+1

' == 'sẽ thất bại nếu có một 'Julia' trong danh sách. 'd.equal? ​​(data.last)' kiểm tra đối với bình đẳng đối tượng. – steenslag

+1

tất nhiên - luôn luôn quên trường hợp không phải duy nhất - cảm ơn - tôi đã sửa câu trả lời để không có một bản sao nào mà không đọc nhận xét – chrispanda

5

Bạn có thể sử dụng name==data.last nếu mảng của bạn là yếu tố độc đáo

Nếu không sử dụng trực tiếp

data.join(', ') 
6

Bạn cần data.join(', '). Bằng cách nào đó, hãy trả lời câu hỏi của bạn:

Không có phương pháp nào để tìm hiểu xem đối tượng hiện tại (trong trường hợp này là "tên") có phải là đối tượng đầu tiên hoặc cuối cùng trong lần lặp lại không?

xs = [1, 2, 3, 4] 
xs.each.with_index do |x, index| 
    if index == 0 
    puts("First element: #{x}") 
    elsif index == xs.size - 1 
    puts("Last element: #{x}") 
    else 
    puts("Element somewhere in the middle: #{x}") 
    end 
end 
Các vấn đề liên quan