2012-02-03 25 views
53

Vì vậy, trong Rails 3.2, ActiveSupport :: Memoizable đã không được chấp nhận.Mẫu ghi nhớ Ruby nào ActiveSupport :: Memoizable tham khảo?

Thông điệp đọc:

DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and 
will be removed in future releases,simply use Ruby memoization 
pattern instead. 

Nó đề cập đến "Ruby memoization mẫu" (số ít) như thể có một mô hình tất cả chúng ta nên biết và tham khảo ...

Tôi đoán họ có nghĩa là một cái gì đó như:

def my_method 
    @my_method ||= # ... go get the value 
end 

hoặc

def my_method 
    return @my_method if defined?(@my_method) 

    @my_method = # ... go get the value 
end 

Có điều gì khác mà tôi đã bỏ lỡ không?

+0

Nếu bạn muốn 'false' hoặc 'nil', nó sẽ không được lưu sử dụng memoizable Ruby. Vì vậy, nếu bạn muốn thực hiện wrapper memoizable của riêng bạn, hãy thêm một cách để lưu 'false' và 'nil'. – rubies

Trả lời

36

Đây là cam kết (và thảo luận tiếp theo), nơi Memoizable được chấp nhận: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

Tác giả ủng hộ cách tiếp cận @foo ||= ...points to this commit là một ví dụ cho việc di chuyển: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3.

Chỉnh sửa: Lưu ý rằng tôi không nhất thiết phải giải thích thay đổi này là có nghĩa là tất cả các phiên bản memoize có thể hoặc nên được thay thế bằng mẫu này. Tôi đọc nó như là có nghĩa là Memoizable không còn cần thiết/muốn trong chính mã Rails. Như ý kiến ​​chỉ ra, Memoizable là nhiều hơn chỉ là một wrapper xung quanh @foo ||= .... Nếu bạn cần những tính năng đó, hãy tiếp tục và sử dụng Memoizable, bạn sẽ chỉ cần lấy nó từ một nơi nào đó ngoài ActiveSupport (tôi đoán ai đó sẽ chia rẽ một phiên bản đá quý, nếu chúng chưa có).

31

Một lựa chọn khác là sử dụng đá quý Memoist:

Nó là một chiết xuất trực tiếp từ ActiveSupport::Memoizable và có thể được sử dụng như một thả thay thế. Chỉ cần require 'memoist' và thay đổi

extend ActiveSupport::Memoizable 

để

extend Memoist 
0

Dựa trên những nhận xét trên the commitreferenced above by avaynshtok, tôi sẽ với điều này:

ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable } 

... bởi vì tôi con tôi sẽ biết khi nào Memoizable được tách ra khỏi ActiveSupport từ bộ RSpec của tôi đang chết ngay từ đầu cổng.

3

Chỉ cần một sự bổ sung cho câu trả lời đầu, để memoize một phương pháp học sử dụng các mô hình sau:

class Foo 
    class << self 
    def bar 
     @bar ||= begin 
     # ... 
     end 
    end 
    end 
end 
Các vấn đề liên quan