我有一个看起来像这样的课程:
class Test
def self.hello
puts "I say hello"
end
def goodbye
puts 'goodbye'
end
hello
goodbye
end
这是我的输出:
ruby class_methods.rb
I say hello
class_methods.rb:11:in `<class:Test>': undefined local variable or method `goodbye' for Test:Class (NameError)
from class_methods.rb:1:in `<main>'
什么是hello
被召唤?它看起来确实被调用但它被调用的是什么?我认为它被称为主要对象......但为什么这有意义呢?我认为只能在类对象本身而不是main
对象上调用类方法?
答案 0 :(得分:3)
你好被召唤的是什么?
每当没有显式接收器时,接收器为self
。所以这个电话是隐含的:
self.hello
...其中self
是类Test
,您刚刚定义了self.hello
方法。
goodbye
,因为它是在类Test
的实例上定义的,而不是当前调用它的类本身。
答案 1 :(得分:2)
def self.hello
是一种类方法
def self.hello
puts "I say hello"
end
hello or Test.hello
#I say hello
def goodbye
是Test
def goodbye
puts 'goodbye'
end
Test.new.goodbye #instance of Test
#goodbye
答案 2 :(得分:0)
self
定义类方法,而定义一个没有self的方法意味着该方法是一个实例方法,因此,调用goodbye
会引发错误,因为没有接收者,一个实例发送该消息或调用该方法需要Test
类。
当ruby解析类并评估代码时,它可以调用hello
,因为不需要实例化对象。
答案 3 :(得分:0)
您将hello定义为类方法,而goodbye是一个实例方法。
class Test
def self.hello
puts "I say hello"
end
...
end
这个类方法,因为你在self上调用hello,这是Test类,所以你可以通过Test.hello
调用hello。
...
def goodbye
puts 'goodbye'
end
要调用goodbye方法,因为这是一个实例方法,您需要使用Test.new
方法创建Test实例。因此,您需要使用Test.new.goodbye
来调用再见方法。