【问题标题】:Ruby method with two arguments (one has default value) only accepts one [closed]具有两个参数(一个具有默认值)的 Ruby 方法只接受一个 [关闭]
【发布时间】:2019-06-28 01:39:26
【问题描述】:

我想写一个 PnP 助手。我创建了一个包含统计信息和统计级别的哈希,并定义了一种方法来升级这些统计信息。这是我的哈希:

$stats = {
"HP" => 300,
"VIT" => 9,
"STR" => 10,
"DEX" => 15,
"SPD" => 8,
"INT" => 11,
"PSY" => 21,
"HW" => 2,
"MED" => 3,
"SCHW" => 0,
"GEN" => 12,
"RGEW" => 25,
"SELB" => 11,
"MKEN" => 19,
"WILL" => 23
}

下面是我的方法:

def level_stat (stat, amount = 1)
  @string = stat.upcase
  print "#{@string}: #{$stats[@string]} > "
  $stats[@string] += 1 * amount
  puts $stats[@string]
  if (@string == "VIT")
    $stats["HP"] += 5 * amount
    print "#{"HP"}: #{$stats["HP"]} > "
    puts $stats["HP"]
  end
end

amount 的默认值将统计数据升级一级,但可以同时对同一统计数据进行多次升级(或者应该如此)。调用它按预期工作:

level_stat ("int")

但是,调用以下语句会引发错误:

level_stat ("vit", 2)
# >> syntax error, unexpected ',', expecting ')'
#    level_stat ("vit", 2)
#                     ^

我不明白它为什么这样做。

【问题讨论】:

  • 不要在方法名称和参数括号之间放置空格。
  • 删除level_stat(之间的空格——无论是在定义方法还是调用它时。
  • 哎呀,这是一个可悲的错误......谢谢大家

标签: ruby methods arguments


【解决方案1】:

只是为了补充@Tom的答案。

看:

def twice(arg)
  puts arg * 2
end

twice 5 #=> 10
twice(5) #=> 10
twice (5) #=> 10
def plus(arg1, arg2)
  puts arg1 + arg2
end

plus 2, 2 #=> 4
plus(2, 2) #=> 4
plus (2, 2) #=> syntax error, unexpected ',', expecting ')'

Ruby 解析器认为 (2, 2) 是单个参数,但 (2, 2) 不是有效的 Ruby 表达式。

这种情况,当使用多个参数时。如您所见,一个论点没有问题。

所以遵循代码风格。伙计们给了你链接。

【讨论】:

    【解决方案2】:

    删除level_stat( 之间的空格,或者完全删除括号:

    level_stat("vit", 2)
    level_stat "vit", 2
    

    通过添加空格括号,ruby 解析器会误解您的意图并引发SyntaxError

    如果您还没有,请快速浏览一下ruby style guide——在def 中省略空格也是常见的做法:

    def level_stat(stat, amount = 1)
      # ...
    end
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2021-11-09
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多