Splat运算符或正则表达式不起作用?

时间:2015-04-15 20:53:45

标签: ruby regex splat

我是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

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

2 个答案:

答案 0 :(得分:2)

使用each来测试所有位置都返回true,而不是使用all?

positions.all? { |position| get_space(position).token =~ /_/ }
只有当每个位置的块返回true时,

positions.all?才会为真。

答案 1 :(得分:1)

其他答案就在你需要做的事情上,但你应该明白为什么你当前的解决方案不起作用。

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

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

这说,&#34;拿c1并将其放入@available_moves如果你得到真实结果b1,c1和d1从空返回为真。这看起来很好并且显然有效。

然而,看看你的其他方面发生了故障:

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

这就是说,&#34;如果......好吧,究竟是什么,将c1铲入available_moves?&#34;如果b1为真,你认为emptyii是真的,但是c1和d1不是吗?如果只有所有这些都是真的,那是真的吗?这究竟是什么?

在你的第一个例子中,你有一个非常明确的表达。然而,这不是。这就是为什么你会得到使用.all?的建议的原因因为你在尝试做的事情上更加清楚,当然实际上会有所作为(相反)你有这个声明)。