2014-10-14 12 views
5

Tôi đã làm việc trên một máy phát điện Pi đơn giản trong khi học Ruby, nhưng tôi tiếp tục nhận NoMethodError trên RubyMine 6.3.3, vì vậy tôi quyết định thực hiện một dự án mới và lớp mới càng đơn giản càng tốt, và tôi STILL lấy NoMethodError. Có lý do gì không?Ruby: NoMethodError, nhưng tại sao?

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

Và lỗi tôi nhận được là:

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

bạn đang gọi phương thức bên trong định nghĩa lớp. Tôi không chắc chắn ý định của nó. – Tensibai

+0

Tôi không chắc chắn về nền tảng/mức độ kinh nghiệm của bạn trong lập trình OO, vì vậy chỉ cần kiểm tra: bạn có hiểu sự khác biệt giữa các lớp và các cá thể (và các phương thức lớp và các phương thức mẫu) không? Câu trả lời giả định bạn làm ... –

Trả lời

7

Bạn đã xác định một phương pháp dụ và đang cố gắng gọi nó như là một phương pháp của một lớp. Vì vậy, bạn cần phải thực hiện phương thức hello một phương thức lớp học, không phải là phương thức thể hiện của lớp Methods.

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

Hoặc, nếu bạn muốn xác định nó như phương pháp dụ sau đó gọi nó như sau:

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

Oh wow ... vì vậy self.hello sẽ giống như C# tương đương với "static (return type) hello"? Khi nào có quyền sử dụng "def hello" –

+0

Bạn nên xóa khoảng trắng giữa tên phương thức và dấu ngoặc đơn. – Stefan

+0

@Stefan Cảm ơn bạn rất nhiều! –

0

Bằng việc xác định một phương thức với def METHOD_NAME args bạn đang xác định một phương pháp dụ mà sẽ được bao gồm trong mọi đối tượng của lớp đó, nhưng không phải trong chính lớp đó.

Mặt khác, bằng cách def self.method_name args bạn sẽ nhận được một phương thức lớp sẽ trực tiếp trong lớp mà không cần phải tạo một đối tượng từ nó.

Vì vậy, nếu bạn có điều này:

Class Test 
    def self.bar 
    end 

    def foo 
    end 

end 

Bạn có thể thực hiện phương pháp dụ theo cách này:

a = Test.new 
a.foo 

Và như đối với lớp một nên là:

Test.foo 
1

Bạn đang cố gắng gọi một phương thức thể hiện như một phương thức lớp.

Dưới đây là một số mã để minh họa sự khác biệt giữa hai trong ruby:

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 

Và bây giờ thử nó ra, kêu gọi các phương pháp ...

# 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

Bạn đã tạo một phương pháp dụ , nhưng bạn đang gọi phương thức lớp. Để gọi hello("Annie"), bạn phải tạo một phiên bản Phương thức. Ví dụ:

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

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

này sẽ ra Hello from Annie

Các vấn đề liên quan