【问题标题】:What is the use in class/static methods in ruby?ruby 中的类/静态方法有什么用?
【发布时间】:2013-08-30 13:53:02
【问题描述】:

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

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

【问题讨论】:

标签: ruby class oop methods


【解决方案1】:

你的例子不好。

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

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

所以类方法管理一个实例集合,而实例方法只管理那个实例。


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

【讨论】:

    【解决方案2】:

    正如你所说,它们是:

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

    请记住,该类是可移植的

    【讨论】:

    • 所以它更像是一种组织性的东西,而不是不同的功能
    • 介于普通方法和类方法之间
    • @user2521439 是的,只是组织性
    • @user2521439 没有“正常方法”-您只是在当前范围的 klass 中调用方法。通过在您的“正常”范围内调用 self.class 向自己证明这一点
    【解决方案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 中,我们力求代码的可重用性、灵活性和可读性,这意味着我们通常希望将大部分代码作为实例方法结构化,放在一个合理的领域模型中。

    【讨论】:

      【解决方案4】:

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

      不太重要的是,类/模块方法可以共享状态而不会到处泄漏(例如,类可以具有实例变量),并且它们可以具有私有支持方法以允许更好的因式分解,而全局方法不能有效设为私有。

      【讨论】:

        【解决方案5】:

        你有很多误解,

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

        类方法用于在类级别提供处理,即只能在类级别可用或与所有对象相关的数据。例如,要计算属于类的对象的数量,您需要类方法。喜欢

        Foo.count  
        

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

        obj.save
        

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

        【讨论】:

        • 在 ruby​​ 中,您可以在对象中动态添加/修改方法。如 obj.define_singleton_method(:new_method) 做“做一些事情”结束
        • 从对象修改现有方法可以通过简单的赋值来完成,例如stackoverflow.com/questions/9786495/…
        猜你喜欢
        • 2011-07-11
        • 2010-11-13
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 2015-06-26
        • 2015-04-05
        相关资源
        最近更新 更多