我的 Ruby 大小写语句语法有什么问题?[复制]

What is wrong with my Ruby case statement syntax? [duplicate]

提问人:Dylan Knorr 提问时间:8/6/2021 最后编辑:Dylan Knorr 更新时间:8/6/2021 访问量:79

问:

我正在尝试从数字字符串中筛选数字并计算每个不同数字的每次出现。 在我看来,我的语法看起来是正确的,但我经常在我的 case 语句中收到语法错误;“出乎意料的'何时'”。 有人可以告诉我我在这里做错了什么吗?

prime_string = "23571113171923293137414347535961677173798389971011031071091131271311371391"

zeroes = 0
ones = 0
twos = 0

count_array = [zeroes, ones, twos]

def numsort(d)
    case d
    when 0
        zeroes++
    when 1
        ones++
    when 2
        twos++
    else
        puts "err"
    end
end

while prime_string.length > 0 do 
    numsort(prime_string.split.shift)
end

puts count_array
Ruby 语法错误 大小写

评论

0赞 Michael Berkowski 8/6/2021
它缺少它的end
0赞 Michael Berkowski 8/6/2021
哦呵呵,红宝石也没有。stackoverflow.com/questions/3717519/......请改用++zeroes +=1
0赞 Cary Swoveland 8/6/2021
我们可以首先将字符串转换为数组: .接下来,在数组上调用 Enumerable#tally 以创建计数哈希: .然后使用 Hash#values_at 构造数组 : 。prime_string.chars #=> ["2", "3", "5",..., "9", "1"]prime_string.chars.tally #=> {"2"=>4, "3"=>14, "5"=>3, "7"=>12, "1"=>22, "9"=>8, "4"=>3, "6"=>2, "8"=>2, "0"=>4}count_arrayprime_string.chars.tally.values_at("0", "1", "2") #=> [4, 22, 4]
0赞 Cary Swoveland 8/6/2021
我们可以通过两种方式来改进这一点。首先,在创建计数哈希之前,仅从 : 生成的数组中选择感兴趣的元素。其次,如果我们替换为 我们得到一个枚举器,它需要的存储空间比 (中间)数组 .然后我们得到 .prime_string.charsprime_string.chars.select { |c| ["0", "1", "2"].include?(c) } #=> ["2", "1", "1", ..., "1"]charseach_charprime_string.charsprime_string.each_char.select { |c| ["0", "1", "2"].include?(c) }.tally.values_at("0", "1", "2") #=> [4, 22, 4]
0赞 Cary Swoveland 8/6/2021
请注意,即使计数哈希仅包含键 ,并且 ,这些键可能按任何顺序排列,因此我们需要以正确的顺序提取这些键的值。(我们不能使用 ,其中是哈希值。"0""1""2"values_ath.valuesh

答:

0赞 Tom Lord 8/6/2021 #1

ruby 中没有 ++ 运算符。

你需要写。+= 1

虽然诚然,由于语法错误,这会导致一些神秘的错误消息,但我要注意的几件事是:

  1. 请仔细阅读错误消息。它告诉您错误的行号,在这种情况下,该行号可能应该指向第一次出现的 ?++
  2. 使用更好的 IDE/编辑器设置!在恶劣的环境中编码就像戴着手铐写软件一样。你的编辑器应该在尝试运行代码之前警告你这里的语法无效。

评论

0赞 Dylan Knorr 8/6/2021
啊,哎呀。这就是我在语言之间切换所得到的......谢谢。我是相当新的,所以我没有花太多时间和精力来学习如何配置 VSC,因为我对自己的偏好和需求没有清晰的认识。
0赞 Tom Lord 8/6/2021
case 语句中也缺少一个 -- 它再次告诉我:使用更好的 IDE 设置来警告你语法错误。看起来您正在尝试用 Ruby :) 编写 Pythonend
0赞 Tom Lord 8/6/2021
另外,为什么你所谓的变量实际上是一个?字符串必须用引号括起来,切换语言不是这个错误的借口......prime_stringInteger
0赞 Tom Lord 8/6/2021
此外,在红宝石中还有一种更简单的方法可以做到这一点;核心语言有一个非常方便的方法:.您可以执行类似 或 .Enumerable#tallyprime_string.chars.tallyprime_number.digits.tally
0赞 Dylan Knorr 8/6/2021
尽管 Python3 是我的第一门语言,但缺少的结尾和缺少的引号实际上是由于试图简化我的 SO 代码。也感谢您的提示。我试一试。