Ruby - 如何缩短我的方法

3 ruby

我在这里有一个哈希:

VALID_CHOICES = {
  'r' => 'rock',
  'p' => 'paper',
  'sc' => 'scissors',
  'l' => 'lizard',
  'sp' => 'spock'
}
Run Code Online (Sandbox Code Playgroud)

并且在这里基本比较一种方法:

def win?(first, second)
  (first == 'sc' && second == 'p') ||
    (first == 'p' && second == 'r') ||
    (first == 'r' && second == 'l') ||
    (first == 'l' && second == 'sp') ||
    (first == 'sp' && second == 'sc') ||
    (first == 'sc' && second == 'l') ||
    (first == 'l' && second == 'p') ||
    (first == 'p' && second == 'sp') ||
    (first == 'sp' && second == 'r') ||
    (first == 'r' && second == 'sc')
end
Run Code Online (Sandbox Code Playgroud)

如何在非常简洁的代码中重写我的方法,这意味着完全相同的事情?任何的想法?是否可以使用哈希来做到这一点?

Pin*_*nyM 7

您应该为每个令牌赢得的内容定义明确的规则:

WINS = {
  'r' => %w{l sc},
  'p' => %w{r sp},  
  'sc' => %w{p l},
  'l' => %w{p sp},
  'sp' => %w{r sc}
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用简单查找来确定胜利:

def win?(first, second)
  WINS[first].include?(second)
end
Run Code Online (Sandbox Code Playgroud)

虽然可能有几种"聪明"的方法可以避免明确的结构WINS,但明确的规则更容易理解 - 因此更易于维护.代码中的简洁性被认为是一个积极的属性,它提高了代码的可读性.简单到极致导致代码难以理解的东西不是要努力的东西.

  • @CarySwoveland`(a.index(first) - a.index(second)).modulo(5).odd?`带数组`a =%w [rp sc sp l]`将是一个"聪明"的方式,但没有人想维护这样的代码;-) (2认同)