-4
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}"

它是三元 if 而不是整体,但其他符号是什么,如 +"、# 或 -~c%3

4

1 回答 1

2

沉思于此,并阅读诸如~and之类的运算符%

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 中,这样的事情很常见,尽管没有任何好处。在“过去”,在铅笔出现之前,我们使用泥板和木棒进行编程,我们被编译器所困扰,无法优化它们的出路,所以人们尝试编写“紧凑”的代码来提高性能。编写紧凑的代码比简洁和晦涩要多得多。所谓的效率也应该涉及,但它经常被抛在后面。

今天的编译器和解释器要聪明得多,因此编写此类代码的原因在很大程度上已经不复存在。人们喜欢编写晦涩难懂的代码作为一种挑战,“仅仅因为”在尽可能小的空间内编写功能性代码,但这不是在真正的编程环境中要做的事情,在这种环境中,团队成员需要阅读和理解它,尤其是在凌晨 3 点,他们已经出城并接到了一些惊慌失措的系统管理员的电话。

于 2013-08-02T22:20:38.427 回答