【问题标题】:Ruby condition to increment one variable or the otherRuby条件增加一个变量或另一个
【发布时间】:2015-04-05 11:14:41
【问题描述】:

假设我必须在 Ruby 中为一个小游戏设置变量

times_won # Any integer
times_lost # Any integer

以及上一轮的结果

result # string, can be: "won", "lost" or "drawn"

有什么更好的方法来做到这一点

times_won += 1 if result == "won"
times_lost += 1 if result == "lost"

我正在尝试使用三元运算符,但我不知道如何将它与多个变量一起使用。案例陈述也不是很好。

也许有人知道一个让我大吃一惊的单行字。

编辑:

这样的嵌套三元运算符中的错误在哪里?

 times_won,times_lost += result == 'drawn'  ? [0,0] : result =='won' ? [1,0] : [0,1]

【问题讨论】:

  • 即使你的最后一行有效,如果没有额外的评论你能理解吗?
  • 好吧,也许不是没有考虑过一段时间,但我的主要兴趣是学习 ruby​​ 中的新东西。
  • 您可以考虑删除变量times_lost:games_played += 1; times_won += 1 if result == "won"。然后根据需要计算损失的数量。是的,仍然有两个语句,应该有。
  • 一篇现已删除的帖子展示了如何使用 eval 来满足您的要求。正如您评论的那样,“这很好”,我不得不说“这很奇怪”会更贴切。一百万年来你永远不会看到eval被这样使用。我什至不确定这是一个严肃的答案。
  • 嵌套三元组中的错误是您只是使代码的可读性降低,这意味着可维护性降低,这意味着更有可能导致错误。不要那样做。 ONLY 时间使用三元是当它导致简化代码时,然后减少其他两个问题。在 Perl 中,我们会使用长三元组,但 Ruby 不是 Perl。

标签: ruby ternary-operator code-formatting


【解决方案1】:

你可以使用哈希:

@counter = {won: 0, lost: 0, drawn: 0}
result = :won

@counter[result] += 1

@counter
#=> {:won=>1, :lost=>0, :drawn=>0}

我使用符号作为键,但它也适用于字符串。

如果您的代码的其他部分依赖于times_wontimes_lost,您可以将它们实现为方法:

def times_won
  @counter[:won]
end

关于您的修改

混合abbreviated assignmentmultiple assignment 不起作用:

a, b += 1, 2 #=> SyntaxError

您必须明确指定计算:

a, b = a + 1, b + 2 # increments `a` by 1 and `b` by 2

当然你可以用更复杂的表达式替换固定值:

a, b = a + (result == 'won' ? 1 : 0), b + (result == 'lost' ? 1 : 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多