最小错误 - ArgumentError:参数数量错误(给定1,预期为0)

时间:2016-02-17 17:37:28

标签: ruby

我正在练习exercise.io。这在规范文档中要求:

  1. Hello World!程序会问候我,来电者。
  2. 如果我告诉节目我的名字是爱丽丝,它会问我#34;你好,爱丽丝!"。
  3. 如果我忽略了我的名字,它会问我"你好,世界!"
  4. class HelloWorldTest < Minitest::Test
      def test_no_name
        assert_equal 'Hello, World!', HelloWorld.hello
      end
    
      def test_sample_name
        assert_equal 'Hello, Alice!', HelloWorld.hello('Alice')
      end
    
      def test_other_sample_name
        assert_equal 'Hello, Bob!', HelloWorld.hello('Bob')
      end
    end
    

    这是我的计划:

    class HelloWorld
      def self.hello
        "Hello, World!"
      end
    
      def initialize(name)
        @name = name
      end
    
      def say_hello
        puts "Hello, #{@name}!"
      end
    end
    
    print "Give me your name: "
    your_name = gets.chomp
    hello = HelloWorld.new(your_name)
    if your_name == ""
      puts "Hello, World!"
    else
      hello.say_hello
    end
    

    程序运行并满足所有要求,但我收到错误:

    1) Error:
    HelloWorldTest#test_sample_name:
    ArgumentError: wrong number of arguments (given 1, expected 0)
        /Users/drempel/exercism/ruby/hello-world/hello_world.rb:3:in `hello'
        hello_world_test.rb:24:in `test_sample_name'
    
    3 runs, 1 assertions, 0 failures, 1 errors, 1 skips
    

    如何定义不需要参数的方法?

3 个答案:

答案 0 :(得分:3)

  

如何定义不需要参数的方法?

你的问题恰恰相反。您正在将参数传递给方法HelloWorld.hello,该方法不接受参数。

您的测试代码与源代码的行为不符。将源代码更改为:

class HelloWorld
  def self.hello(name = "World")
    "Hello, #{name}!"
  end
end

此处,name = "World"表示name参数是可选的,默认值为"World"

或者,将测试更改为:

assert_equal 'Hello, Alice!', HelloWorld.new('Alice').say_hello
assert_equal 'Hello, Bob!', HelloWorld.new('Bob').say_hello

答案 1 :(得分:1)

有时在测试中你说

HelloWorld.hello('Alice')

您在测试中的其他时间

HelloWorld.hello

所以你要调用方法&#34;你好&#34;有和没有争论。

要使参数可选,您可以为它们指定默认值。

def self.hello(name_to_use=nil)
  if name_to_use
    "Hello, #{name_to_use}!"
  else
    "Hello, World!"
  end
end

答案 2 :(得分:0)

  

如何定义不需要参数的方法?

了解错误消息的含义非常重要,因为我在Learn.co&#39; s Object-Oriented TicTacToe challenge上遇到了类似的问题。当您的代码针对测试代码运行时,测试代码是&#34;给出&#34; 'Alice'方法#self.hello的一个参数。但是你所编写的#self.hello方法正好需要零参数。因此:

ArgumentError: wrong number of arguments (given 1, expected 0)
/Users/drempel/exercism/ruby/hello-world/hello_world.rb:3:in `hello'
hello_world_test.rb:24:in `test_sample_name'

我的错误信息类似,我有同样的思路:&#34;如果它预期为0,我怎么能给它0?&#34;显然,从我们的经验中得到的关键是更好地理解错误信息的含义。