2010-06-12 26 views
11

UPDATE 2: Đối với hậu thế, đây là cách tôi đã giải quyết trên làm việc đó (nhờ đầu vào Jorg của):Tuyên bố một dãy số nguyên với bước = 1 trong Ruby

100.step(2, -2) do |x| 
    # my code 
end 

(Rõ ràng là có rất nhiều cách để làm điều này, nhưng có vẻ như đây là "Ruby" cách nhất để làm điều đó, và đó chính xác là những gì tôi đã sau)


CẬP NHẬT:. OK, vì vậy những gì tôi đang tìm kiếm cho là step:

(2..100).step(2) do |x| 
    # my code 
end 

Nhưng hóa ra tôi không đạt 100% trong câu hỏi ban đầu. Tôi thực sự muốn lặp lại trên phạm vi này ngược. Trước sự ngạc nhiên của tôi, một bước tiêu cực không hợp pháp.

(100..2).step(-2) do |x| 
    # ArgumentError: step can't be negative 
end 

Vì vậy: làm cách nào để làm điều này ngược?


Hey guys, tôi hoàn toàn mới để Ruby, vì vậy hãy nhẹ nhàng.

Giả sử tôi muốn lặp qua phạm vi số chẵn từ 2 đến 100; làm thế nào tôi sẽ làm điều đó?

Rõ ràng là tôi thể làm:

(2..100).each do |x| 
    if x % 2 == 0 
     # my code 
    end 
end 

Nhưng, rõ ràng (một lần nữa), đó sẽ là khá ngu ngốc.

Tôi biết tôi có thể làm một cái gì đó như: (?)

i = 2 
while i <= 100 
    # my code 
    i += 2 
end 

Tôi tin rằng tôi cũng có thể viết lớp tùy chỉnh của riêng tôi cung cấp each phương pháp riêng của mình. Tôi gần như chắc chắn rằng sẽ là overkill, mặc dù.

Tôi quan tâm đến hai điều:

  1. thể để làm điều này với một số biến thể của cú pháp Phạm vi tiêu chuẩn (ví dụ: (x..y).each)?
  2. Dù bằng cách nào, điều gì sẽ là "cách Ruby" thành ngữ nhất để hoàn thành việc này (sử dụng Phạm vi hoặc cách khác)? Như tôi đã nói, tôi mới học ngôn ngữ; vì vậy bất kỳ hướng dẫn nào bạn có thể cung cấp về cách làm mọi thứ theo phong cách Ruby điển hình hơn sẽ được đánh giá cao.

Trả lời

19

Bạn không thể khai báo một Range với một "bước". Phạm vi không có các bước, họ chỉ đơn giản là có một sự khởi đầu và kết thúc.

Bạn có thể chắc chắn lặp hơn một Range trong các bước, ví dụ như thế này:

(2..100).step(2).reverse_each(&method(:p)) 

Nhưng nếu tất cả các bạn muốn là để lặp, sau đó những gì bạn cần Range cho ở nơi đầu tiên? Tại sao không chỉ lặp lại?

100.step(2, -2, &method(:p)) 

Điều này có thêm lợi ích không giống như reverse_each không cần tạo mảng trung gian.

+0

Rất đẹp. Chính xác những gì tôi cần - và cảm ơn cũng vì đã làm rõ thuật ngữ của tôi. Đã xóa rất nhiều! –

+0

@ Jörg bất kỳ ý tưởng làm thế nào bạn đã kết thúc với tuyên bố cuối cùng? Các tài liệu cho bước đề cập đến chỉ có một đối số, vì vậy tôi đã tự hỏi làm thế nào bạn làm việc theo cách của bạn để cách gọn gàng của giải quyết vấn đề này. –

+0

@n_x_l: Tôi không chắc bạn đang xem tài liệu nào, tham số 'bước' là [được ghi rõ ràng] (http://Ruby-Doc.Org/core-2.1.1/Numeric.html#method-i -bậc thang). Các tài liệu lâu đời nhất mà tôi có thể tìm thấy là những tài liệu dành cho Ruby 1.8.6 và nó [đã có sẵn] (http://Ruby-Doc.Org/core-1.8.6/Numeric.html#method-i-step) trở lại sau đó trong năm 2007. –

3

Câu hỏi này trả lời của bạn: about ruby range?

(2..100).step(2) do |x| 
    # your code 
end 
+0

Thật đơn giản, eh? Cảm ơn! –

+0

Vì vậy, làm thế nào tôi sẽ làm điều đó ngược? –

1

Tôi có vấn đề tương tự ở đây là những cách khác nhau tôi thấy để làm điều ĐƠN GIẢN cùng tôi đã sử dụng bước cuối cùng bởi vì nó cho phép gia tăng tiêu cực và Fractional và tôi đã không có điều kiện, trừ các giới hạn để tìm kiếm

case loop_type 

    when FOR 
     # doen't appear to have a negative or larger than 1 step size! 
     for kg in 50..120 do 
     kg_to_stones_lbs(kg) 
     end 

    when STEP 
     120.step(70,-0.5){ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when UPTO 
     50.upto(120) { |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when DOWNTO 
     120.downto(50){ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when RANGE 
     (50..120).reverse_each{ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when WHILE 
     kg = 120 
     while kg >= 50 
     kg_to_stones_lbs(kg) 
     kg -= 0.5 
     end 
    end 

O/P:

92.0kg - 14st 7lbs

91.5kg - 14st 6lbs

91.0kg - 14st £ 5

90.5kg - 4lbs 14st

90.0kg - 14st 2lbs

89.5kg - 14st 1lbs

89.0kg - 14st 0lbs

88.5kg - 13st 13lbs

88,0 kg - 13st 12lbs

Các vấn đề liên quan