在Ruby中重构每个/ reverse_each代码的最佳方法是什么?

时间:2016-05-30 07:42:05

标签: ruby data-structures linked-list refactoring doubly-linked-list

我已为双向链表实施了这些eachreverse_each方法。

重构这个的最佳方法是什么?

def each
  return enum_for(:each) unless block_given?
  node = self
  until node.nil?
    yield node
    node = node.next
  end
end

def reverse_each
  return enum_for(:reverse_each) unless block_given?
  node = self
  until node.nil?
    yield node
    node = node.prev
  end
end

2 个答案:

答案 0 :(得分:3)

删除冗余代码的最简单方法是将其移至新方法。

这样的事情应该有效:

def each(&block)
  return enum_for(:each) unless block_given?
  traverse(:next, &block)
end

def reverse_each(&block)
  return enum_for(:reverse_each) unless block_given?
  traverse(:prev, &block)
end

private

def traverse(direction)
  node = self
  until node.nil?
    yield node
    node = node.send(direction)
  end
end

答案 1 :(得分:2)

这样的事情:

{ each: :next , reverse_each: :prev }.each_pair do |name, _method|
  define_method(name) do |&blk|
    return enum_for(name) unless block_given?
    node = self
    until node.nil?
      blk.call(node)
      node = node.send(_method)
    end
  end
end

了解define_methoddynamic define methods