簡體   English   中英

所有的類方法都用“ def self.foo”定義嗎?

[英]Are all class methods defined with “def self.foo”?

我對以下想法正確嗎? 建議/反饋非常感謝!


通過查看是否在方法名稱之前指定了關鍵字self我們可以判斷哪個方法是實例方法,哪個方法是類方法。

因此,該方法(例如: def self.foo_bar )定義為類方法。 另一方面, def foo_bar被定義為實例方法。

不,您不能那樣做。 考慮一下:

class C
  class << self
    def m
      puts 'pancakes!'
    end
  end
  def i
    puts 'eggs'
  end
end

這樣就為您提供了C上的類方法m ,該方法的聲明中沒有“自我”。 但是,您可以向類詢問有關其方法的信息:

C.methods.include? :m
# true
C.methods.include? :i
# false
C.instance_methods.include? :i
# true

考慮到Ruby類的可變性,詢問類是唯一的確定方法。

除了帶有self.方法外,還有更多的方法來定義類方法self. 在類定義中:

class A
  def A.method1
  end

  class << self
    def method2
    end
  end
end

A.instance_eval do
  def method3
  end
end

module B
  def method4
  end
end

A.extend B

p A.methods.first(4)

# >> [:method1, :method2, :method3, :method4]

作為另一種選擇,您可以在以下代碼段的幫助下查看所有類方法:

class C
  class << self
    def first
    end
  end
  def C.second
  end
  def self.third
  end
end

eigenclass = class << C; self; end
eigenclass.instance_methods(false)  # => [:first, :second, :third]

這是因為所有類方法都是該Class對象的eigenclass實例方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM