【问题标题】:Why the ruby code will generate an ArgumentError?为什么 ruby​​ 代码会生成 ArgumentError?
【发布时间】:2016-03-04 07:44:48
【问题描述】:

您好,我正在研究 Ruby Koans。我想知道如果在下面的代码中返回Dog6.new,为什么会引发ArgumentError

class Dog6
  attr_reader :name 
  def initialize(initial_name)
    @name = initial_name 
  end
end

def test_initialize_provides_initial_values_for_instance_variables
  fido = Dog6.new("Fido")
  assert_equal "Fido", fido.name
end

def test_args_to_new_must_match_initialize
  assert_raise(ArgumentError) do
    Dog6.new
  end
end

是因为Dog6.new没有任何参数吗?谢谢!!

【问题讨论】:

    标签: ruby arguments


    【解决方案1】:

    是的,你的假设是正确的。

    Dog6.new 隐式调用Dog6#initialize 来初始化新创建的实例(人们可能会将MyClass#initialize 视为此类的构造函数),它显然有一个必需 参数。由于对Dog6.new 的调用没有提供任何参数,因此正在引发ArgumentError

    【讨论】:

    • 感谢您的解释!现在我明白了:)
    【解决方案2】:

    只是补充一点,如果你想有一个不带参数的构造函数(毕竟 - 有些狗没有名字......)你可以为 name 参数设置一个默认值。

    def initialize(name = nil)
      @name = name
    end
    

    【讨论】:

    • 添加默认值会破坏测试。这绝不是一个适用的解决方案。
    • 确实!显然,您必须首先更改测试。 :-)
    • 我宁愿删除那个测试。测试所有可能的 ArgumentError 对我来说似乎没有建设性。
    【解决方案3】:

    Dog6 类的初始化程序中,initial_name 被定义为对象构造所需的参数。如果要在没有此参数的情况下实例化此类,则会引发ArgumentError,因为类定义具有方法签名,因此Dog6.new 无效,就像您猜到的那样。在这种情况下,您将看到的错误是:

    ArgumentError: wrong number of arguments (0 for 1)
    

    详细了解 ArgumentError 异常 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 2019-09-20
      • 2020-07-17
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多