【问题标题】:ArgumentError in Ruby codewars 8 kyu kataRuby codewars 8 kyu kata 中的 ArgumentError
【发布时间】:2023-01-17 20:41:57
【问题描述】:

问题:假二进制:给定一串数字,你应该用'0'替换5以下的任何数字,用'1'替换5及以上的任何数字。返回结果字符串。

任何人都可以解释为什么我得到这个错误:./lib/solution.rb:4:in `>': comparison of String with 5 failed (ArgumentError)

def fake_bin(s)
  arr = s.split("")
  
  arr.map! { |x| if x > 5 ? x = 1 : x = 0 }
  
  return arr.join("")
end

我实际上已经用 gsub 完成了解决方案,所以我不需要其他建议,我只是很好奇为什么我无法使这种方法起作用以及导致此错误的原因。

我确实尝试过以多种方式构建 if 语句,但没有任何区别。

【问题讨论】:

  • 您不能(直接)将字符串与整数进行比较。使用x.to_i 将您的字符串转换为整数。
  • 此外,您的地图中不需要 if 声明。你可以做arr.map! {|x| x.to_i >= 5 ? 1 : 0}

标签: ruby argument-error


【解决方案1】:

对于mapmap! 块返回什么很重要,分配将不起作用。

然后你得到了 if 和三元语句之间的一些混合。

此外,您正在将一个字符串(输入作为一个字符串,您 split 将其转换为子字符串)与一个整数进行比较,这就是错误的来源。 使用to_i 将字符串转换为整数解决了这个问题。

最后,您不需要返回值。 Ruby 具有隐式返回,其中返回方法中的最后一个值。

所以这样的事情应该有效:

def fake_bin(s)
  arr = s.split("")
  
  arr.map! { |x| x.to_i > 5 ? 1 : 0 }
  
  arr.join("")
end

如果你想缩短它,你可以跳过中间分配并链接所有调用:

def fake_bin(s)
  s
    .split("")
    .map { |x| x.to_i > 5 ? 1 : 0 }
    .join("")
end

【讨论】:

  • 更短:.split("") == .chars.join("") == .join
【解决方案2】:

你得到这个错误的原因是因为字符串不能与整数进行比较。

您将字符串拆分为每个字符,这会为您提供字符串中每个字符的数组,如下所示:

s = "12345"
arr = s.split("")
=> ["1","2","3","4","5"]

当您映射其中的每一个时,您将获取每个元素(例如,第一次迭代将给您 "1",但它是 STRING 形式),然后将其与整数 5 进行比较。这种比较是非法的,会抛出错误。

在不重新设计解决方案的情况下,您有三种选择。

  1. 将字符串转换为整数(不推荐,您可能会遇到无法将字符串转换为整数的类型错误)
  2. 将整数转换为字符串(但请看数字 3)
  3. 只需使用一个字符串来比较 (!)

    第三个是最好的。您的解决方案将如下所示:

    (PS:你有一些小的外观错误,我也已经修复了你的三元语句)

    def fake_bin(s)
      arr = s.split("")
      
      arr.map! { |x| x > "5" ? "1" : "0" }
      
      return arr.join("")
    end
    

    希望这可以帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多