Kos*_*tas 15 ruby coding-style memoization
我想避免在方法调用中重新评估值.直到现在,我这样做:
def some_method
@some_method ||= begin
# lot's of code
end
end
Run Code Online (Sandbox Code Playgroud)
但它最终变得非常丑陋.在某些代码中,我看到如下内容:
def some_method
@some_method ||= some_method!
end
private
def some_method!
# lot's of code
end
Run Code Online (Sandbox Code Playgroud)
我不喜欢最后的爆炸(!),所以我想出了这个:
def some_method
@some_method ||= _some_method
end
private
def _some_method
# lot's of code
end
Run Code Online (Sandbox Code Playgroud)
Agi*_*gis 24
我会这样做:
def filesize
@filesize ||= calculate_filesize
end
private
def calculate_filesize
# ...
end
Run Code Online (Sandbox Code Playgroud)
所以我只是以不同的方式命名方法,因为我觉得它更有意义.
小智 9
还有一种方法,我认为更多Java风格.
首先,您应该实现注释,例如" Ruby中的Java样式注释 "和" 如何在Ruby 中模拟类似Java的注释? ".
然后你应该添加像_cacheable这样的注释,它会告诉它应该返回实例变量的方法,如果它是null,它应该通过调用方法来计算它,所以你的代码会更清楚:
_cacheable
def some_method
# do_some_work
end
Run Code Online (Sandbox Code Playgroud)
我使用memoist gem,它可以让你轻松地记忆方法,而无需改变原始方法或创建两种方法.
因此,例如,而不是有两种方法,file_size并calculate_file_size和不必自己与一个实例变量实现记忆化:
def file_size
@file_size ||= calculate_file_size
end
def calculate_file_size
# code to calculate the file size
end
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
def file_size
# code to calculate the file size
end
memoize :file_size
Run Code Online (Sandbox Code Playgroud)
每个memoized函数都有一种刷新现有值的方法.
object.file_size # returns the memoized value
object.file_size(true) # bypasses the memoized value and rememoizes it
Run Code Online (Sandbox Code Playgroud)
所以打电话object.file_size(true)相当于打电话object.calculate_file_size......
| 归档时间: |
|
| 查看次数: |
3957 次 |
| 最近记录: |