1

嗨,我在练习 18 中收到错误“未定义的方法”,尽管我按照它写的那样做。

class Exercise18_NamesVariablesCodeFunctions

# this one is like your scripts with ARGV
 def print_two(*args)
  arg1, arg2 = args
  puts "arg1: #{arg1}, arg2: #{arg2}"
 end

# ok, that *args is actually pointless, we can just do this
 def print_two_again(arg1, arg2)
  puts "arg1: #{arg1}, arg2: #{arg2}"
 end

# this just takes one argument
 def print_one(arg1)
  puts "arg1: #{arg1}"
 end

# this one takes no arguments
 def print_none()
  puts "I got nothin'."
 end


 print_two("Zed","Shaw")
 print_two_again("Zed","Shaw")
 print_one("First!")
 print_none()

end

这是我的错误:

exercise18_names_variables_code_functions.rb:25:in `<class:Exercise18_NamesVariablesCodeFunctions>': undefined method `print_two' for Exercise18_NamesVariablesCodeFunctions:Class (NoMethodError)
Did you mean?  print
    from exercise18_names_variables_code_functions.rb:1:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

我不明白这个错误。我定义了所有的方法。当我添加自我。它适用于所有方法。

4

2 回答 2

3

原因是类内部的任何方法调用都在调用类方法,而您定义的所有方法都是实例方法。

由于您的代码当前是编写的,您可以在定义类的实例后调用这些方法。

exercises = Exercise18_NamesVariablesCodeFunctions.new

exercises.print_two("Zed","Shaw") #=> "arg1: Zed, arg2: Shaw"

练习是类本身的一个实例,因此可以访问该类的实例方法。

如果要像当前一样调用方法,则需要将这些方法更改为类方法,只需self.在每个函数的名称前添加

 def self.print_two(*args)
  arg1, arg2 = args
  puts "arg1: #{arg1}, arg2: #{arg2}"
 end

现在,您将能够从类内部调用该方法。

您还可以将所有类方法包装在一个容器中。

class Test
  class << self
    def first_method
    end

    def second_method
    end
  end
end

现在,里面的任何方法class << self都是类方法。

于 2016-10-15T15:58:55.013 回答
0

尝试关注。

class Exercise18_NamesVariablesCodeFunctions

# this one is like your scripts with ARGV
 def print_two(*args)
  arg1, arg2 = args
  puts "arg1: #{arg1}, arg2: #{arg2}"
 end

# ok, that *args is actually pointless, we can just do this
 def print_two_again(arg1, arg2)
  puts "arg1: #{arg1}, arg2: #{arg2}"
 end

# this just takes one argument
 def print_one(arg1)
  puts "arg1: #{arg1}"
 end

# this one takes no arguments
 def print_none()
  puts "I got nothin'."
 end

a = Exercise18_NamesVariablesCodeFunctions.new

 a.print_two("Zed","Shaw")
 a.print_two_again("Zed","Shaw")
 a.print_one("First!")
 a.print_none()

end
于 2016-10-15T16:23:32.780 回答