2012-04-30 23 views
6
module Pigged 
    String.class_eval do 
    def pig 
     newstring = self + self[0]; newstring[0] = ""; newstring += "ay" 
     return newstring 
    end 
    end 
end 

là mã có liên quan. Những gì tôi muốn làm là thực hiện một phương pháp, pig!, mà sửa đổi chuỗi ban đầu. Làm thế nào để tôi làm điều đó, mà không sửa đổi bản thân, bởi vì điều đó không được phép ...?Sửa đổi Self, Ruby

Trả lời

3

Bạn không nên sửa đổi bản thân.

Sử dụng replace hoặc phương pháp tùy chỉnh.

Đọc 'Writing method "change!" for String' để biết thêm thông tin.

+2

Không thực sự. Có * tấn * thứ trong thư viện. Lấy 'String # <<', ví dụ. Điều đó thay đổi chuỗi hiện có và là một trong những phương thức được sử dụng nhiều nhất trong tất cả các chương trình Ruby (đằng sau những thứ như 'puts' và' + '). – Linuxios

+1

Câu trả lời này tốt hơn: http://stackoverflow.com/a/10391724/199712 –

4

Đối với chuỗi, bạn có thể sử dụng self.replace để thay đổi nội dung.

Đối với các lớp khác, tôi không nghĩ rằng nó có thể tự sửa đổi trừ khi tạo đối tượng mới.

1

Không có gì sai khi sửa đổi self, bạn không thể gán cho nó, nhưng bạn có thể sử dụng các phương thức accessor để sửa đổi hoặc sửa đổi các biến mẫu nếu bạn có quyền truy cập trực tiếp vào chúng. String#replace là một accessor trong trường hợp cụ thể này.

Một ví dụ khác:

class Array 
    def delete_first_element! 
    self[0..0] = [] 
    end 
end 

a = [1,2,3] 
b = a 

a.delete_first_element! 

puts a.inspect # [2,3] 
puts b.inspect # [2,3]! 

Một điều cần nhớ - bạn thay đổi tất cả các tài liệu tham khảo của cùng một đối tượng (b trong ví dụ của tôi)!

13

Tôi đã ngưng tụ mã của bạn một chút và thêm pig! phương pháp:

module Pigged 
    String.class_eval do 
    def pig 
     self[1..-1] + self[0] + 'ay' 
    end 
    def pig! 
     self.replace(pig) #self.replace(self[1..-1] + self[0] + 'ay') 
    end 
    end 
end 
+1

'lợn!' Nên chỉ là 'self.replace pig' để tránh lặp lại phép tính chung. – dbenhur

+1

Tôi thích câu trả lời này tốt hơn câu trả lời ngoại trừ vì bạn đã cung cấp giải pháp. Đoán tôi lười biếng - nhưng tại sao chúng ta lại nhấp vào một liên kết khác? – UncleAdam

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