ruby DRY返回值?

use*_*302 0 ruby return ruby-on-rails dry

这可能是一个愚蠢的问题,但我的rails应用程序开始受到这种代码风格的困扰:

def return_my_object
  @object = get_object
  some_function_work(@object)
  return @object
end
Run Code Online (Sandbox Code Playgroud)

是否有一般做法或方法来摆脱或避免return @object代码?到目前为止,我无法想到任何东西,它似乎是残酷的代码.

Dan*_*ers 5

您可以使用Object#tap轻微简化该代码.Tap将对象生成块,并在块完成后返回对象.因此,它没有设置@object为的值some_function_work,而是设置的结果get_object.但是,如果some_function_work改变@object,这显然会反映出来,因为它是同一个实例.

那是:

def return_my_object
  @object = get_object.tap { |o| some_function_work(o) }
end
Run Code Online (Sandbox Code Playgroud)

方法(@object)的最后一个表达式也将被返回.

下面是一个最小的示例,其中为块{}.tap生成一个新Hash实例,该块将在块完成时返回.在块内部,我们改变了Hash,它反映在分配给的结果中@object.

@object = {}.tap { |hash| hash[:key] = :value }
# { :key => :value }
Run Code Online (Sandbox Code Playgroud)