ruby中的类/静态方法有什么用?

时间:2013-08-27 17:24:27

标签: ruby class oop methods

学习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

因为它们都产生相同的结果? 我对他们很困惑,所以如果我误解了这里的任何事情,请纠正。

5 个答案:

答案 0 :(得分:12)

你的榜样不是很好。

类方法可能会处理管理类中存在的所有实例,而实例方法一次只处理一个实例。

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实例的标题。

因此,管理实例集合的类方法和实例方法只管理该实例。


通常,如果一个方法对一组实例进行操作,或者是与该类相关的代码但不直接读取或更新单个实例,那么它可能应该是一个类方法。

答案 1 :(得分:3)

就像你说的那样,他们是:

  • “从课程而不是从对象访问”
  • “只能同时运行一个。”

也要记住,班级是便携式的

答案 2 :(得分:3)

这是一个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)的实例或对象访问实例方法。

示例是从here复制的,您还可以在其中找到有关此主题的更多信息。

请记住:虽然任何代码都可以放入类或实例方法中,但每个代码都有自己的用例和自己的优缺点。在OOP中,我们努力获得可重用,灵活和可读的代码,这意味着我们通常希望将大多数代码作为结构化实例方法放在合理的域模型中。

答案 3 :(得分:0)

最重要的是它可以保持代码的有序性。当你拥有数十万行代码时,让它们随意乱扔在同一个命名空间中可能会成为一场噩梦。组织非常重要,命名空间是通过语言支持获得模块化的简单方法。

有点不那么重要的是,类/模块方法可以共享状态而不会泄漏它(例如,类可以有实例变量),并且它们可以有私有支持方法以允许更好的因子分解,而全局方法不能有效被私有化。

答案 4 :(得分:0)

你有很多误解,

在ruby中,我们可以定义类和实例方法。

类方法用于提供类级别的处理,即只能在类级别获得或与所有对象相关的数据。例如,要计算属于类的对象数,则需要类方法。像

Foo.count  

同样,要处理单个对象,您需要使用对象方法来处理单个对象,例如

obj.save

因此,类方法是单重设计模式的一个例子,其中对象可以有自己的相同方法的实现。