Rock Paper Scissors语法解释

时间:2013-08-02 19:27:02

标签: ruby

def play(i)
  s=%w[Rock Paper Scissors]
  p=s.index i
  s[c=rand(3)]+",#{p==c ?:Draw: p&&p==-~c%3?:Win: :Lose}"
end
play("Rock")

我可以请求帮助解释语法

 s[c=rand(3)]+",#{p==c ?:Draw: p&&p==-~c%3?:Win: :Lose}"

除了总体而言,它是三元的,但是其他符号如+“,#或 - ~c%3

1 个答案:

答案 0 :(得分:2)

冥想这一点,并阅读有关~%等操作符的信息:

ROCK_PAPER_SCISSORS = %w[Rock Paper Scissors]

def play(i)
  p = ROCK_PAPER_SCISSORS.index i
  response = rand(3)

  win_lose_draw = if (p == response)
    :Draw
  else
    if (p && p == -~response % 3)
      :Win
    else
      :Lose
    end
  end

  ROCK_PAPER_SCISSORS[response] + ",#{ win_lose_draw }"
end

puts play("Rock")

在我看来,无论是谁写了原文都迷恋于编写模糊不清的代码,认为它是男子气概,或者是在试图编写一些边缘混淆的东西。无论哪种方式,都不要试图模仿这个例子,特别是在Ruby中。

在C和Perl中,这种情况很常见,但实际上没有任何好处。在过去的日子里,在有铅笔之前,我们使用泥片和棒进行编程,我们背负着无法优化自己的方式的编译器,所以人们尝试写作& #34;紧"用于提高性能的代码。编写严密的代码比编写简洁而晦涩难懂更多;也应该涉及一些所谓的效率,但这通常会被遗忘。

今天的编译器和解释器更加智能,因此编写此类代码背后的原因基本消失了。人们喜欢将模糊的代码写成一个挑战,在尽可能小的空间内编写功能的东西"只是因为",但它不是在真实的编程环境中做的事情,你在那里' ;团队成员需要阅读和理解它,特别是凌晨3点他们已经出城并接到一些恐慌系统管理员的电话。