当实例方法调用类方法时,我必须使用self.class_method?

时间:2011-03-03 21:34:49

标签: ruby

我收到错误所以我想我必须使用self.class_method_name从实例方法中引用类方法,但为什么会这样?

不应该自己解决这个问题吗?困惑。

def self.blah(string)
  ..
end

def some_method()
  some_thing = blah("hello")
end

2 个答案:

答案 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中没有任何类方法,“类方法”实际上是单例类的方法。