2

我是 Ruby 的新手,并且将国际象棋构建为一种学习练习。我正在尝试重构一些代码,但我遇到了阻碍。

为什么会这样:

@available_moves = []

#part of castling logic
@available_moves << "c1" if empty?("b1") && empty?("c1") && empty?("d1")

def empty?(position)
  get_space(position).token =~ /_/
end
# sample tokens: "_e4", "ka2", "_b3"

...这不是吗?:

@available_moves = []

@available_moves << "c1" if emptyii?("b1", "c1", "d1")

def emptyii?(*positions)
  positions.each { |position| get_space(position).token =~ /_/ }
end

这可能是非常愚蠢的事情,但我无法弄清楚我做错了什么。

4

2 回答 2

2

代替使用each,使用all?来测试所有位置是否返回真:

positions.all? { |position| get_space(position).token =~ /_/ }

positions.all?仅当块为每个位置返回 true 时才会为 true。

于 2015-04-15T21:01:05.120 回答
1

就您需要做什么而言,其他答案就在这里,但您应该了解为什么您当前的解决方案不起作用。

你走在正确的道路上,但你只需要更深入地观察你的逻辑。让我们考虑一下代码中的两行:

@available_moves << "c1" if empty?("b1") && empty?("c1") && empty?("d1")

这就是说,“如果你得到 b1、c1 和 d1 的真值结果从空返回为真,则将 c1 放入 @available_moves 中。这看起来不错并且显然有效。

但是,请查看您的另一条线路出现问题:

@available_moves << "c1" if emptyii?("b1", "c1", "d1")

这就是说,“如果......好吧,究竟是什么?”将c1铲入available_moves。如果 b1 为真,但 c1 和 d1 不是,您是否认为 emptyii 为真?如果只有所有这些都是真的,这是真的吗?究竟是哪一个?

在您的第一个示例中,您的表达非常清晰。然而,这不是。这就是为什么你得到使用建议的原因.all?因为这对你想要做的事情更加清楚,当然会实际工作(与你的这个陈述相反)。

于 2015-04-15T21:21:47.267 回答