a = [ "a", "b", "c", "d" ]
a.rotate #=> ["b", "c", "d", "a"]
#rotate
là một phương pháp Array
trong Ruby 1.9. Tôi muốn chức năng này trong Ruby 1.8.7. Mã lý tưởng là gì?Mảng # xoay tương đương trong ruby 1.8.7
a = [ "a", "b", "c", "d" ]
a.rotate #=> ["b", "c", "d", "a"]
#rotate
là một phương pháp Array
trong Ruby 1.9. Tôi muốn chức năng này trong Ruby 1.8.7. Mã lý tưởng là gì?Mảng # xoay tương đương trong ruby 1.8.7
Nếu bạn require 'backports/1.9.2/array/rotate'
, bạn sẽ nhận được Array#rotate
và rotate!
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 []
!
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).
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
Đ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. –
Để 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
Cả hai đều thất bại đối với '[]'. Xem câu trả lời của tôi. –
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
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
phiên bản 'xoay' của bạn thay đổi mảng ban đầu' a' – rubyprince
@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
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
Tôi sẽ bao gồm backports nếu tôi đang làm việc từ Cygwin như thế nào? –
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. –
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. –