簡體   English   中英

ruby中的類/靜態方法有什么用?

[英]What is the use in class/static methods in ruby?

學習ruby和oop一般來說,我遇到了類方法,據我所知,它們就像實例方法,但是可以從類而不是從對象訪問,並且只能同時運行一個。

但是,我不明白為什么你會使用普通方法(類外)的類方法,甚至它們的用途是什么?

例如:

#Why would you use:
class Foo
  def self.bar
    puts "Class method"
  end
end

#Versus simply:
def bar
  puts "Normal method"
end

Foo.bar # => Class method
bar # => Normal method

因為它們都產生相同的結果? 我對他們很困惑,所以如果我誤解了這里的任何事情,請糾正。

你的榜樣不是很好。

類方法可能會處理管理類中存在的所有實例,而實例方法一次只處理一個實例。

class Book
  def self.all_by_author(author)
    # made up database call
    database.find_all(:books, where: { author: author }).map do |book_data|
      new book_data # Same as: Book.new(book_data)
    end
  end

  def title
    @title
  end
end


books = Book.all_by_author('Jules Vern')
books[0].title #=> 'Journey to the Center of the Earth'

在這個例子中,我們有一個名為Book的類。 它有一個類方法all_by_author 它查詢一些偽裝數據庫並返回一個Book實例數組。 實例方法title獲取單個Book實例的標題。

因此,管理實例集合的類方法和實例方法僅管理該實例。


通常,如果方法將對一組實例進行操作,或者是與該類相關但不直接讀取或更新單個實例的代碼,則它可能應該是類方法。

正如你所說,它們是:

  • “從課堂而不是從對象訪問”
  • “可以只有一個同時運行。”

還要記住,班級是便攜式的

這是一個OOP問題,而不是紅寶石問題。 ruby中的類方法與其他OO編程語言中的類方法相同。 這意味着:

  • 類方法在類的上下文中運行(並且只能訪問類變量)
  • 實例方法在對象的上下文中運行(並且可以訪問對象或實例變量)

這是一個更好的例子:

class Foo
  def self.bar
    puts 'class method'
  end

  def baz
    puts 'instance method'
  end
end

Foo.bar # => "class method"
Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class

Foo.new.baz # => instance method
Foo.new.bar # => NoMethodError: undefined method ‘bar

在這里,您可以看到類方法是通過類訪問的,而實例方法是通過類的實例或對象( Foo.new )訪問的。

此處復制示例,您還可以其中找到有關此主題的更多信息。

請記住:雖然任何代碼都可以放入類或實例方法中,但每個代碼都有自己的用例和自己的優缺點。 在OOP中,我們努力尋找可重用,靈活和可讀的代碼,這意味着我們通常希望將大多數代碼作為結構化實例方法放在合理的域模型中。

最重要的是它可以保持代碼的有序性。 當你擁有數十萬行代碼時,讓它們隨意亂扔在同一個命名空間中可能會成為一場噩夢。 組織非常重要,命名空間是通過語言支持獲得模塊化的簡單方法。

不那么重要的是,類/模塊方法可以共享狀態而不會在整個地方泄漏它(例如,類可以有實例變量),並且它們可以有私有支持方法以允許更好的因子分解,而全局方法不能有效地變為私有。

你有很多誤解,

在ruby中,我們可以定義類和實例方法。

類方法用於提供類級別的處理,即只能在類級別或與所有對象相關的數據。 例如,要計算屬於類的對象數,則需要類方法。 喜歡

Foo.count  

同樣,要處理單個對象,您需要使用對象方法來處理單個對象,如

obj.save

因此,類方法是單重設計模式的一個例子,其中對象可以有自己的相同方法的實現。

暫無
暫無

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

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