我已为双向链表实施了这些each
和reverse_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
答案 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