繁体   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