在方法调用中是否存在memoization约定?

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)
  • 是否在下划线上有一个好的约定?
  • memoized/non-memoized对方法是否有其他约定?
  • 是否有一些惯例来记忆多行方法?

Agi*_*gis 24

我会这样做:

def filesize
  @filesize ||= calculate_filesize
end

private

def calculate_filesize
  # ...
end
Run Code Online (Sandbox Code Playgroud)

所以我只是以不同的方式命名方法,因为我觉得它更有意义.

  • 为什么?它在语义上是有意义的,而且非常明显它在做什么.对于更少角色的盲目追求让你无视最佳答案. (7认同)

小智 9

还有一种方法,我认为更多Java风格.

首先,您应该实现注释,例如" Ruby中的Java样式注释 "和" 如何在Ruby 中模拟类似Java的注释? ".

然后你应该添加像_cacheable这样的注释,它会告诉它应该返回实例变量的方法,如果它是null,它应该通过调用方法来计算它,所以你的代码会更清楚:

_cacheable
def some_method
   # do_some_work
end
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ick 5

我使用memoist gem,它可以让你轻松地记忆方法,而无需改变原始方法或创建两种方法.

因此,例如,而不是有两种方法,file_sizecalculate_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......