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