2012-08-12 42 views
5

Tôi đang cố gắng để có được một kiểu mã hóa Ruby tốt. Để ngăn tình cờ gọi một biến cục bộ có cùng tên, tôi luôn sử dụng self. nếu thích hợp. Nhưng bây giờ tôi vấp trên này:Gọi phương thức riêng xxx bằng self.xxx() từ bên trong phương thức riêng khác dẫn đến lỗi "phương thức riêng` xxx 'được gọi là "

class MyClass < ActiveRecord::Base 
    before_validation :sanitize_user_data 

    private 

    def sanitize_user_data 
    self.sanitize_name # with ".self" it's a problem, without it's not! 
    end 

    def sanitize_name 
    unless self.name.nil? 
     self.name.gsub!(/\s+/, ' ') 
     self.name.strip! 
    end 
    end 
end 

Kết quả mã trên trong một lỗi

method private sanitize_name gọi

nhưng khi tháo self. và chỉ sử dụng sanitize_name, nó hoạt động. Tại sao vậy?

Trả lời

8

Điều này xảy ra bởi vì phương pháp tư nhân không thể được gọi với một máy thu rõ ràng, và nói self.sanitize_name được chỉ định rõ đối tượng (self) mà nên nhận sanitize_name, chứ không phải dựa vào người nhận ngầm (mà cũng là self).

Bạn không thể tránh điều này, bạn cần gọi số đồng bằng cũ sanitize_name mà không có người nhận rõ ràng hoặc làm self.send(:sanitize_name). Tôi không chắc chắn rằng luôn luôn xác định rõ ràng self thực sự là "phong cách tốt", nhưng đó là chủ quan. Nếu bạn muốn đảm bảo bạn đang gọi một phương pháp thay vì một biến, thêm dấu ngoặc đơn:

def a; "method"; end 
a = "variable" 
a() #=> "method" 
a #=> "variable" 
+0

Cảm ơn bạn đã giải thích. Tôi sẽ ghi nhớ điều này, nhưng tôi thực sự hiểu nó, tôi sẽ phải đào sâu vào ruột của Ruby, đúng không? –

+3

@JoshuaMuheim Không nhất thiết, nó chỉ là cách thức làm việc riêng tư, bằng cách cấm một người nhận rõ ràng không thể được gọi từ bất cứ nơi nào mà người nhận tiềm ẩn không giống 'self', nó chỉ có tác dụng phụ không may của việc ngăn cản bạn gọi một phương thức riêng với cùng một máy thu rõ ràng như là bộ nhận ngầm. –

+0

Được rồi, điều đó thật thú vị. Cảm ơn rất nhiều vì đã giải thích. :) –

2

Tại sao vậy?

Theo định nghĩa. Các phương thức riêng tư chỉ có thể được gọi bằng tin nhắn không nhận được, đó là định nghĩa của phương tiện private.

+0

+1 Ngắn & ngọt. –

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