2016-10-15 2 views
1

Привет, я получаю ошибку «неопределенный метод» в упражнении 18, хотя мне это понравилось, как написано.Ruby Exercise 18 undefined method, хотя я определил методы

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>' 

Я не понимаю эту ошибку. Я определил весь метод. Когда я добавляю себя. для всех методов он работает.

ответ

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 является методом класса.

+0

спасибо. Теперь я понимаю. – AlaskaStack

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 
Смежные вопросы