2014-10-14 2 views
5

Я работал над простым генератором Pi, изучая Ruby, но я продолжал получать NoMethodError на RubyMine 6.3.3, поэтому я решил как можно проще создать новый проект и новый класс, а I STILL получить NoMethodError. Любая причина?Ruby: NoMethodError, но почему?

class Methods 
    def hello (player) 
    print "Hello, " << player 
    end 
    hello ("Annie") 
end 

И ошибка я получаю:

C:/Users/Annie the Eagle/Documents/Coding/Ruby/Learning Environment/methods.rb:5:in `<class:Methods>': undefined method `hello' for Methods:Class (NoMethodError) 
+0

вы вызываете метод внутри определения класса. Я не уверен в его намерении. – Tensibai

+0

Я не уверен в вашем опыте/уровне опыта программирования OO, поэтому просто чтобы проверить: вы понимаете разницу между классами и экземплярами (и методы класса и методы экземпляра)? Ответ предполагает, что вы ... –

ответ

7

Вы определили метод экземпляра и пытаются назвать это как метода класса. Таким образом, вы должны сделать метод hello методом класса, а не методом экземпляра класса Methods.

class Methods 
    def self.hello(player) 
    print "Hello, " << player 
    end 
    hello("Annie") 
end 

Или, если вы хотите, чтобы определить его как метод экземпляра затем вызвать его, как показано ниже:

class Methods 
    def hello(player) 
    print "Hello, " << player 
    end 
end 
Methods.new.hello("Annie") 
+0

О, ничего себе ... поэтому self.hello будет таким же, как эквивалент C# «статического (возвращаемого типа) привет»? Когда было бы правильно использовать только «def hello» –

+0

Вы должны удалить пробел между именем метода и скобкой. – Stefan

+0

@Stefan Большое спасибо! –

0

Определяя метод с Защиту METHOD_NAME арг вы определяете метод экземпляра, будет включен в каждый объект этого класса, но не в самом классе.

С другой стороны, по адресу def self.method_name args вы получите метод класса, который будет непосредственно в классе, без необходимости запускать из него объект.

Так что если у вас есть это:

Class Test 
    def self.bar 
    end 

    def foo 
    end 

end 

Вы можете выполнить метод экземпляра таким образом:

a = Test.new 
a.foo 

И как для класса один должен быть:

Test.foo 
1

You «Попробуйте вызвать метод экземпляра как метод класса.

Вот код, который иллюстрирует разницу между этими двумя в рубин:

class Person 

    # This is a class method - note it's prefixed by self 
    # (which in this context refers to the Person class) 
    def self.species 
    puts 'Human' 
    # Note: species is OK as a class method because it's the same 
    # for all instances of the person class - ie, 'Bob', 'Mary', 
    # 'Peggy-Sue', and whoever else, are ALL Human. 
    end 

    # The methods below aren't prefixed with self., and are 
    # therefore instance methods 

    # This is the construct, called automatically when 
    # a new object is created 
    def initialize(name) 
    # @name is an instance variable 
    @name = name 
    end 

    def say_hello 
    puts "Hello from #{@name}" 
    end 

end 

А теперь попробовать его, называя методы ...

# Call a class method... 
# We're not referring to any one 'instance' of Person, 
Person.species #=> 'Human' 

# Create an instance 
bob = Person.new('Bob') 

# Call a method on the 'Bob' instance 
bob.say_hello #=> 'Hello from Bob' 

# Call a method on the Person class, going through the bob instance 
bob.class.species #=> 'Human' 

# Try to call the class method directly on the instance 
bob.species #=> NoMethodError 

# Try to call the instance method on the class 
# (this is the error you are getting) 
Person.say_hello #=> NoMethodError 
1

Вы создали метод экземпляра , но вы вызываете метод класса. Чтобы позвонить hello("Annie"), вам нужно сделать экземпляр методов. Например:

class Methods 
    def self.hello(player) 
     print "Hello, " << player 
    end 
end 

my_method = Methods.new 
my_method.hello("Annie) 

Это выведет Hello from Annie

Смежные вопросы