2013-08-27 40 views
6

一般来说学习ruby和oop,我遇到了类方法,据我所知,它类似于实例方法,但是可以从类而不是从对象访问,并且只能同时运行一个。ruby​​中的class/static方法有什么用?

但是,我不明白为什么你会使用一个类方法与正常方法(在类之外)以及它们的用途有什么关系?

例如:

#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 

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

+0

你应该阅读一些基本的面向对象的书。这将有助于更多地理解这些基本概念。 –

+0

@maximus你可以推荐任何(或免费在线的更棒!)? – user2521439

+0

为了学习基本的OOP概念,我建议你阅读o'reilly系列书http://shop.oreilly.com/product/9780596008673.do并学习红宝石。红宝书是最好的http://www.sapphiresteel.com/ruby-programming/The-Book-Of-Ruby –

回答

10

你的例子不是很好的例子。

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

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

所以管理实例集合的类方法和实例方法只管理那个实例。


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

3

正如你说的,他们是:

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

请记住,这个类是便携式

+1

所以更多的是组织的事情,而不是不同的功能 – user2521439

+0

这是一个正常的方法和类方法之间 – user2521439

+0

@ user2521439是的,只是组织 –

0

,最重要的是,它让你的代码组织。当你拥有数十万行代码时,将它们全部随意地扔在同一个命名空间中可能会变成一场噩梦。组织非常重要,命名空间是通过语言支持获得模块性的简单方法。不太重要的是,类/模块方法可以共享状态而不会漏到所有的地方(例如类可以有实例变量),并且它们可以有私有的支持方法以允许更好的因式分解,而全局方法不能有效地变为私人。

0

你有很多的误解,

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

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

Foo.count 

在同样的方式,来处理单个对象,你需要对象的方法来处理一个单一的对象一样,

obj.save 

所以,类方法是例如singletone设计模式,其中对象可以有自己的实施相同的方法。

+0

..... *在ruby中如何使用* –

+0

您可以在对象中动态添加/修改方法。如在obj.define_singleton_method(:new_method)中做 “做一些事情” 结束 –

+0

从对象修改现有的方法可以通过像这里这样的简单赋值来完成http://stackoverflow.com/questions/9786495/dynamically-replace-method-实施上,一个对象 - 在 - 红宝石 –

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中,我们致力于可重用,灵活和可读的代码,这意味着我们通常希望将大多数代码结构化为实例方法,并将其置于合理的领域模型中。

相关问题