2011-03-11 29 views

Trả lời

11

Nếu bạn require 'backports/1.9.2/array/rotate', bạn sẽ nhận được Array#rotaterotate! trong các phiên bản cũ của Ruby.

Dù bằng cách nào, bạn tránh phát minh lại bánh xe, và quan trọng hơn là bạn có được lợi thế của việc triển khai vượt qua RubySpec. Nó sẽ làm việc cho tất cả các trường hợp góc và đảm bảo khả năng tương thích với Ruby 1.9.

Ví dụ: không có câu trả lời nào trong số hai câu trả lời được cung cấp cho []!

+0

Tôi sẽ bao gồm backports nếu tôi đang làm việc từ Cygwin như thế nào? –

+0

Backports là một đá quý, vì vậy bạn cần phải "gem install backports' theo hướng dẫn cài đặt. –

+0

Cảm ơn bạn, tôi đã cài đặt và sử dụng đá quý tốt; Cygwin làm cho việc cài đặt những thứ không gây phiền toái cho gói mặc định. –

9

Bạn có thể thực hiện tương tự với a.push(a.shift). Về cơ bản nó loại bỏ phần tử đầu tiên (shift) và gắn nó vào cuối (push).

+0

nhưng nó cũng thay đổi mảng gốc .. có cách nào không thay đổi mảng ban đầu không? – rubyprince

+0

Điều này sẽ là 'xoay! ', Điều này làm biến đổi mảng, nhưng nó không thành công cho' [] '. Nó cũng không hoàn toàn tương thích với 1,9 vì nó không chấp nhận một đối số cho bao nhiêu yếu tố để xoay. Xem câu trả lời của tôi. –

1

Để xoay! phiên bản không có tham số, gnab's là tốt. Nếu bạn muốn một không phá hủy, với tham số tùy chọn:

class Array 
    def rotate n = 1; self[n..-1]+self[0...n] end 
end 

Nếu n có thể trở nên lớn hơn so với chiều dài của mảng:

class Array 
    def rotate n = 1; return self if empty?; n %= length; self[n..-1]+self[0...n] end 
end 
+0

Cả hai đều thất bại đối với '[]'. Xem câu trả lời của tôi. –

+0

Tôi đã khắc phục ví dụ thứ hai sau điểm của Marc-Andre, nhưng tôi đồng ý rằng 'backports' sẽ tốt hơn. Tôi đã không sửa lỗi đầu tiên vì nó có thể không sử dụng. – sawa

2

Không có gì giống như đến cách muộn để đảng ...;)

Tương tự như a.rotate!(n):

a += a.shift(n) 

Và nó hoạt động với a = []. Tuy nhiên, không giống như a.rotate!(n), nó không làm bất cứ điều gì nếu n lớn hơn chiều dài a.

Sau đây bảo tồn giá trị của a và cho phép n lớn hơn a.length để làm việc, tại các chi phí của việc phức tạp hơn một chút:

a.last(a.length - (n % a.length)) + a.first(n % a.length) 

Điều này sẽ rõ ràng là tốt nhất nếu n % a.length được tính một lần riêng rẽ và toàn bộ điều được bọc trong một con khỉ phương pháp được vá thành Array.

class Array 
    def rot(n) 
    m = n % self.length 
    self.last(self.length - m) + self.first(m) 
    end 
end 
+0

phiên bản 'xoay' của bạn thay đổi mảng ban đầu' a' – rubyprince

+0

@rubyprince ah vâng, thực sự là vậy. Tôi nghĩ Ruby là một chút không nhất quán trong các định nghĩa phương thức của nó. Tôi nghĩ rằng 'shift' nên rời khỏi Array một mình, và họ nên có một sự thay đổi' 'để thực sự sửa đổi nó trực tiếp. – lurker

+0

Phương thức 'shift' thực sự trả về phần tử đã dịch chuyển và nó thay đổi mảng ban đầu. rất hữu dụng. – rubyprince

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