我收到错误所以我想我必须使用self.class_method_name从实例方法中引用类方法,但为什么会这样?
不应该自己解决这个问题吗?困惑。
def self.blah(string)
..
end
def some_method()
some_thing = blah("hello")
end
答案 0 :(得分:3)
如果你有
# This won't work
class Foo
def self.blah(string)
puts "self.blah called with a string of #{string}"
end
def some_method
# This won't work
self.blah("hello")
end
end
foo = Foo.new
foo.some_method
它不起作用,因为它会查找实例方法Foo#blah
。相反,您正在寻找Foo.bar
。
要some_method
拨打Foo.bar
,您必须some_method
引用Foo
课程,然后在其上拨打blah
。
class Foo
def self.blah(string)
puts "self.blah called with a string of #{string}"
end
def some_method
# This will work
self.class.blah("hello")
end
end
foo = Foo.new
foo.some_method
您def self.blah
定义方法但self.class.blah
调用该方法的原因是前者self
引用Foo
类,在后者中,self
引用foo
对象,因此您需要self.class
来引用Foo
类。
答案 1 :(得分:1)
将self
视为方法名称的一部分可能更容易,这样很明显,您从未定义过blah
方法,只定义了self.blah
方法。 (澄清:以前的句子不应该被认为太多,所以请不要读它,因为事情并非如何实际运作,只是一种“外行人的术语”试图描述为什么它不起作用。)
另外,如果除了类方法之外已经定义了blah
实例方法,该怎么办?如果调用blah
足以访问类方法,您将如何调用实例方法?
最后,Ruby中没有任何类方法,“类方法”实际上是单例类的方法。